我正在尝试使用posix线程编写一些代码,但我从第一步开始就陷入困境,说实话我无法理解为什么。我知道我的问题可能与某种同步有关,但我无法弄明白。
我的主要内容如下:
while(1){
int x = getX();
pthread_t t;
printf("Main: %d\n",x);
pthread_create(&t, NULL, process_x, &x);
}
当我尝试从main和process_x函数打印x值时,我得到的是这样的:
主要:1
主要:2
主要:3
主要:4
主要:5
Process_x:5
我在这里想念什么?
----编辑-----
好的,也许我需要提供更多信息。 getX函数从套接字接收数据并返回标识符,而现在我们需要process_x只打印它接收的参数。
答案 0 :(得分:1)
您需要考虑将x
的地址传递给线程,然后在不等待线程完成打印的情况下,修改它的值。显然,这意味着如果在线程打印它的值之前几次迭代结束,那么值就会发生变化。
围绕这个的两种方式:
1)使用pthread_join
并等待线程完成。这实际上是无用的。因为那么产生新线程的重点是什么?
OR
2)为每个线程分配一个新地址,让线程在完成打印后释放它。
即。 malloc
一个新的整数,为该整数分配x
,将新的malloc
d整数传递给线程,完成后让线程free
。
答案 1 :(得分:0)
使用对pthread_create
的调用,一旦创建线程就不会执行。调度程序可以决定将其保留在队列中。在此期间,您的while
循环已运行5次,x
的值也可能已更改为5.现在,当您的线程最终被安排时,它(它们)只会看到您的x
的最新值,因此只有5个。
我强烈怀疑Process_x
只打印一次?
没有以任何特定顺序执行pthread的默认方式。您需要使用一些同步技术,如信号量。另外,如果您希望Process_x
打印所有值,请将x
转换为数组并将x[i]
作为参数传递给pthread_create
答案 2 :(得分:0)
显然使用malloc不起作用,因为它将x设置为0,因此进程总是读为0.但是由于每个人的想法,我终于使用条件变量使它工作,现在一切正常。这是代码。
int main{
pthread_t t;
int x;
while(1){
pthread_mutex_lock(&receive);
x = getX();
printf("Main: %d\n",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);
}