这是互斥锁的典型示例。我不知道为什么以下代码不起作用,即。它没有打印" ctr = 0"每次(但是,例如,ctr = 535)。
int ctr;
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
void * add (void * arg_wsk)
{
int i;
for (i = 0; i < 100000; i++) {
pthread_mutex_lock (&m);
ctr++;
pthread_mutex_unlock (&m);
}
return(NULL);
}
void * sub(void * arg_wsk)
{
int i;
for (i = 0; i < 100000; i++) {
pthread_mutex_lock (&m);
ctr--;
pthread_mutex_unlock (&m);
}
return(NULL);
}
int main()
{
pthread_t tid1, tid2;
int i;
void *res;
ctr = 0;
pthread_mutex_init(&m, NULL);
pthread_create(&tid1, NULL, add, NULL);
pthread_detach(tid1);
pthread_create(&tid2, NULL, sub, NULL);
pthread_detach(tid2);
pthread_join(tid1, &res);
pthread_join(tid2, &res);
pthread_mutex_destroy(&m);
printf("ctr = %d", ctr);
pthread_exit(NULL);
}
答案 0 :(得分:4)
我认为您滥用POSIX API。如果分离线程,则不应加入它们。删除分离,看看这是否有所改善。我想你会看到main()现在阻塞,直到线程完成。
另请注意,来自联接电话的链接
ESRCH No thread could be found corresponding to that specified by the
given thread ID.
如果你很幸运,你会点击这个。如果你不幸运,会发生疯狂的事情。不要在同一个线程上混合分离和连接调用。
答案 1 :(得分:1)
您的计数器ctr
的值取决于完成其完整执行的两个线程。
根据pthread_detach(3)
一旦线程被分离,它就无法加入 pthread_join(3)或再次成为可加入的。
如果您从程序中删除pthread_detach
来电,您将获得预期的输出。
另外,请考虑显式创建可连接(或分离)的线程以实现可移植性。