我正试图使用posix线程编写一些代码,但从第一步开始我就被卡住了,老实说,我不知道为什么。我知道我的问题可能与某种同步有关,但我想不通。
我主要有以下内容:
while(1){
int x = getX();
pthread_t t;
printf("Main: %dn",x);
pthread_create(&t, NULL, process_x, &x);
}
当我试图从main和process_x函数打印x值时,我得到的是这样的东西:
Main:1
Main:2
Main:3
Main:4
Main:5
处理_x:5
我在这里想念什么?
----编辑-----
好的,也许我需要提供更多的信息。getX函数从套接字接收数据并返回一个标识符,而为了我们现在的需要,process_x只打印它接收的参数。
您需要考虑将x
的地址传递给线程,然后在不等待线程完成打印的情况下修改其值。显然,这意味着,如果在线程打印其值之前完成了几次迭代,那么值就会发生变化。
有两种方法:
1) 使用pthread_join
并等待线程完成。这在本质上是无用的。因为那生成新线程的意义何在?
或
2) 为每个线程分配一个新地址,并让线程在打印完成后释放它。
即malloc
是一个新的整数,将x
分配给该整数,将新的malloc
d整数传递给线程,让线程free
在完成时完成。
使用对pthread_create
的调用创建线程后,线程将不会立即执行。调度程序可以决定将其保留在队列中。在此期间,您的while
循环已经运行了5次,并且x
的值可能也已更改为5。现在,当线程最终被调度时,它只看到x
的最新值,因此只打印5。
我强烈怀疑Process_x
只打印过一次?
没有默认的方法可以按照任何特定的顺序执行pthreads。你需要使用一些同步技术,比如信号量。此外,如果您希望看到Process_x
打印所有值,请将x
转换为一个数组,并将x[i]
作为参数传递给pthread_create
显然,使用malloc不起作用,因为它将x设置为0,所以进程总是读取0。但多亏了每个人的想法,我终于使用了一个条件变量,现在一切都好了。
int main{
pthread_t t;
int x;
while(1){
pthread_mutex_lock(&receive);
x = getX();
printf("Main: %dn",x);
pthread_create(&t, NULL, process_x, &x);
pthread_cond_wait(&goOn, &receive);
pthread_mutex_unlock(&receive);
}
}
void *process_x(void* arg){
pthread_mutex_lock(&receive);
int x = *(int *) arg;
pthread_cond_signal(&goOn);
pthread_mutex_unlock(&receive);
}