[英]pthread argument's value changed
这是我的主要功能,其中NO_RECIEVERS = 3
。 我正在尝试使用我发送的i
的值来区分作者线程和读者线程。
int main() {
int status, i;
pthread_t tr[NO_RECIEVERS], tw[NO_SENDERS], bd;
i=1;
for(i=1; i<=NO_SENDERS; i++) {
pthread_create(&tw[i-1], NULL, writer, &i);
}
for(i=1; i<=NO_RECIEVERS; i++) {
printf("%d\n", i);
pthread_create(&tr[i-1], NULL, reader, &i);
}
pthread_create(&bd, NULL ,daemon_thread, NULL);
for(i=1; i<=NO_SENDERS; i++) {
pthread_join(tw[i-1], NULL);
}
for(i=1; i<=NO_RECIEVERS; i++) {
pthread_join(tr[i-1], NULL);
}
pthread_join(bd, NULL);
return 0;
}
我的阅读器功能如下
void* reader(void *val) {
int ret, fd, id;
struct mssg data;
id = *(int*)val;
printf("id: %d %d\n", id, *(int*)val);
while(1) {
但是这个函数似乎正在创建ID为一些随机值的线程..我得到这样的日志
...
id: 1 1
...
id: 2 2
...
id: 1 1
下次我得到..它是随机的
...
id: 1 1
...
2
id: 2 2
...
id: 4 4
但是我分配的值仅限于1,2,3
您将&i
传递给了创建的所有线程...,因此每个线程都有一个指向i
的指针,并且当它们取消引用该指针以读取i
的值时,所读取的内容就是i
当时的状态。
如果要在pthread_create
时传递i
的值,我建议malloc()
一小块内存,将i
复制到其中,然后将malloced的内容传递给线程(可以读取它,而free()
可以内存或任何其他方法,可以为创建的每个线程在不同的位置提供i
的副本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.