在这种情况下如何使用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
有办法解决吗?谢谢!
答案 0 :(得分:2)
如上所述,所有线程都会传递指向相同数据的指针,fgets
每次调用时都会覆盖该数据。所以你的输出会有点随机,可能会损坏。
您可以将读取的行的副本交给每个线程,并让每个线程释放它(例如)。
while (fgets(...))
pthread_create(..., (void*)strdup(line));
在线程过程中,您应检查传入的数据是否为空(如果strdup
无法为副本分配足够的内存,则可能发生),并添加:
free(data);
一旦你完成了它。
每个线程都有一个单独的(静态)缓冲区也可以工作,但你必须知道你预先启动了多少(或做一些动态的重新分配或类似的东西)。
答案 1 :(得分:1)
这是共享的行变量。您有一个竞争条件,在线程缓冲区填充下一行之前,线程可以处理缓冲区。您必须分配一个新缓冲区以传递给每个线程。