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

时间:2016-10-16 00:30:27

标签: c multithreading pthreads

我正在使用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);

那样引用

1 个答案:

答案 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] = ...
    }