pthread和私人数据

时间:2011-04-16 14:32:55

标签: c pthreads

在这种情况下如何使用pthread?代码从stdin接收请求并根据某些规则返回结果。但是当我创建一个线程时,id和url的值由所有线程共享。例如:

void * filter(void * data){
        int id;
        char url[1024];
        sscanf((char *) data, "%d %1024s", &id, url);
        sleep(id);
        printf("%s\n", url);
}

while(fgets(line, BUFFER, stdin)!=NULL)
   pthread_create(&thread, NULL, &filter, (void *) line);

---从stdin收到

1个 2两 3三 4四 5五

---输出

一个 三 四 五 5

- 但结果必须是

一个 二 三 四 5

有办法解决吗?谢谢!

2 个答案:

答案 0 :(得分:2)

如上所述,所有线程都会传递指向相同数据的指针,fgets每次调用时都会覆盖该数据。所以你的输出会有点随机,可能会损坏。

您可以将读取的行的副本交给每个线程,并让每个线程释放它(例如)。

while (fgets(...))
  pthread_create(..., (void*)strdup(line));

在线程过程中,您应检查传入的数据是否为空(如果strdup无法为副本分配足够的内存,则可能发生),并添加:

free(data);

一旦你完成了它。

每个线程都有一个单独的(静态)缓冲区也可以工作,但你必须知道你预先启动了多少(或做一些动态的重新分配或类似的东西)。

答案 1 :(得分:1)

这是共享的行变量。您有一个竞争条件,在线程缓冲区填充下一行之前,线程可以处理缓冲区。您必须分配一个新缓冲区以传递给每个线程。