c-需要动态pthread生成同步(??)



我正试图使用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);
}

最新更新