我正在使用C语言进行线程练习,它是许多学校教授的典型线程调度代码,这里可以看到一个基本的代码,我的代码基本上是相同的,除了我改变的运行方法 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分配给一个值,并将该值分配给运行器中的int以用作修饰符,但由于有5个并发线程,因此最终将此数字分配给所有5个线程,并且它们最终具有相同的修饰符。
所以我正在寻找一种方法来解决这个问题,它可以用于所有单个线程,而不是将它分配给所有线程,我试图将参数更改为(void *param, int modifier)
但是当我这样做时,我不知道如何引用跑步者,因为默认情况下它会像pthread_create(&tid[i],&attr,runner,NULL);
答案 0 :(得分:0)
您希望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] = ...
}