1

我试图通过使用互斥锁来测试 pthread:

#include <stdio.h>
#include <pthread.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>

pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
int global = 0;
void thread_set();
void thread_read();



int main(void){
  pthread_t thread1, thread2;
  int re_value1, re_value2;
  int i;
  for(i = 0; i < 5; i++){
    re_value1 = pthread_create(&thread1,NULL, (void*)&thread_set,NULL);
    re_value2 = pthread_create(&thread2,NULL,(void*)&thread_read,NULL);
  }

  pthread_join(thread1,NULL);
  pthread_join(thread2,NULL);
  /* sleep(2); */ // without it the 5 iteration couldn't finish
  printf("exsiting\n");
  exit(0);
}

void thread_set(){
  pthread_mutex_lock(&mutex1);
  printf("Setting data\t");
  global = rand();
  pthread_mutex_unlock(&mutex1);
}
void thread_read(){
  int data;
  pthread_mutex_lock(&mutex1);
  data = global;
  printf("the value is: %d\n",data);
  pthread_mutex_unlock(&mutex1);
}

没有sleep(),代码将无法完成 5 次迭代:

设置数据值为:1804289383 值为:1804289383 设置数据值为:846930886 现有

设定数据值为:1804289383 设定数据值为:846930886 值为:846930886 现有

它只能将 sleep() 添加到主线程,我认为它应该在没有 的情况下工作sleep(),因为 join() 函数等待每个子线程终止

任何人都可以告诉我为什么会这样吗?

4

2 回答 2

1

您正在创建 10 个线程(每个线程的 5 次迭代),但只加入您创建的最后两个线程(如 mathematician1975 所述,您正在重新使用线程句柄变量,因此最后一次迭代的值是您唯一的值可以加入)。如果没有sleep(),调度程序很可能在您点击 之前还没有开始执行前 8 个线程exit(),这会自动终止所有线程,无论它们是否有机会运行。

于 2012-08-08T16:06:49.147 回答
1

您对互斥对象的使用看起来不错,但是这个循环

for(i = 0; i < 5; i++) {
     re_value1 = pthread_create(&thread1,NULL, (void*)&thread_set,NULL);
     re_value2 = pthread_create(&thread2,NULL,(void*)&thread_read,NULL);
}

thread1当您重用相同的线程实例以及thread2循环的每次迭代时,这是在自找麻烦。在内部,这一定会引起问题,尽管我不知道它会如何表现出来。您确实应该为每个要确保可靠运行的线程使用单独的线程对象实例。我不知道如果您pthread_create使用已经在运行的线程对象的实例调用会发生什么,但我怀疑这不是明智的做法。我怀疑它最多会阻塞,直到线程函数退出。

此外,您不会检查pthread_create()其中任何一个的返回值,这可能是一个好主意。总之,我会使用线程对象的单独实例,或者将pthread_join调用添加到循环内部,以便您确定线程在下一次调用pthread_create().

最后,传递给函数的函数签名pthread_create()是类型

 void* thread_function(void*);

并不是

 void thead_function()

就像你在你的代码中一样。

于 2012-08-08T15:54:20.487 回答