gpt4 book ai didi

c - 如何将特定值传递给一个线程?

转载 作者:行者123 更新时间:2023-11-30 19:37:18 24 4
gpt4 key购买 nike

我正在用 C 语言进行线程练习,这是许多学校教授的典型线程调度代码,基本的代码可以在这里看到,我的代码基本上是相同的,除了我改变了 runner 方法 http://webhome.csc.uvic.ca/~wkui/Courses/CSC360/pthreadScheduling.c

我所做的基本上是改变运行者部分,以便我的代码打印一个包含一定范围内的随机数的数组,而不是仅仅打印一些单词。我的运行者代码在这里:

void *runner(void *param) {
int i, j, total;
int threadarray[100];

for (i = 0; i < 100; i++)
threadarray[i] = rand() % ((199 + modifier*100) + 1 - (100 + modifier*100)) + (100 + modifier*100);

/* prints array and add to total */
for (j = 0; j < 100; j += 10) {
printf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n", threadarray[j], threadarray[j+1], threadarray[j+2], threadarray[j+3], threadarray[j+4], threadarray[j+5], threadarray[j+6], threadarray[j+7], threadarray[j+8], threadarray[j+9]);
total = total + threadarray[j] + threadarray[j+1] + threadarray[j+2] + threadarray[j+3] + threadarray[j+4] + threadarray[j+5] + threadarray[j+6] + threadarray[j+7] + threadarray[j+8] + threadarray[j+9];
}
printf("Thread %d finished running, total is: %d\n", pthread_self(), total);
pthread_exit(0);
}

我的问题在于第一个 for 循环,我在其中为数组分配随机数,我希望此修饰符根据它所在的线程进行更改,但我不知道如何执行此操作,例如,如果第一个线程的范围为 100-199,第二个线程的范围为 200-299,依此类推。我尝试在执行 pthread_create 之前将 i 分配给一个值,并将该值分配给 runner 中的 int 以用作修饰符,但由于有 5 个并发线程,因此最终会将此数字分配给所有 5 个线程,并且它们最终会得到相同的修饰符。

所以我正在寻找一种方法来解决这个问题,它将适用于所有单独的线程,而不是将其分配给所有线程,我尝试将参数更改为类似 (void *param, int 修饰符) 但当我这样做时,我不知道如何引用 runner,因为默认情况下它的引用方式类似于 pthread_create(&tid[i],&attr,runner,NULL);

最佳答案

您想让param指向一个数据结构或变量,其生命周期将比线程生命周期长。然后将 void* 参数转换为其分配的实际数据类型。

简单的例子:

struct thread_data
{
int thread_index;
int start;
int end;
}

struct thread_info;
{
struct thread_data data;
pthread_t thread;
}

struct thread_info threads[10];

for (int x = 0; x < 10; x++)
{
struct thread_data* pData = (struct thread_data*)malloc(sizeof(struct thread_data)); // never pass a stack variable as a thread parameter. Always allocate it from the heap.

pData->thread_index = x;
pData->start = 100 * x + 1;
pData->end = 100*(x+1) - 1;
pthread_create(&(threads[x].thread), NULL, runner, pData);
}

然后你的运行者:

void *runner(void *param)
{
struct thread_data* data = (struct thread_data*)param;
int modifier = data->thread_index;
int i, j, total;
int threadarray[100];

for (i = 0; i < 100; i++)
{
threadarray[i] = ...
}

关于c - 如何将特定值传递给一个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40065620/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com