pthread_join 和 pthread_mutex_lock 有啥区别?
Posted
技术标签:
【中文标题】pthread_join 和 pthread_mutex_lock 有啥区别?【英文标题】:Whats the difference between pthread_join and pthread_mutex_lock?pthread_join 和 pthread_mutex_lock 有什么区别? 【发布时间】:2015-10-02 17:10:13 【问题描述】:以下代码取自this site,它展示了如何使用互斥锁。它同时实现了 pthread_join 和 pthread_mutex_lock:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void *functionC();
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
int counter = 0;
main()
int rc1, rc2;
pthread_t thread1, thread2;
/* Create independent threads each of which will execute functionC */
if( (rc1=pthread_create( &thread1, NULL, &functionC, NULL)) )
printf("Thread creation failed: %d\n", rc1);
if( (rc2=pthread_create( &thread2, NULL, &functionC, NULL)) )
printf("Thread creation failed: %d\n", rc2);
/* Wait till threads are complete before main continues. Unless we */
/* wait we run the risk of executing an exit which will terminate */
/* the process and all threads before the threads have completed. */
pthread_join( thread1, NULL);
pthread_join( thread2, NULL);
exit(EXIT_SUCCESS);
void *functionC()
pthread_mutex_lock( &mutex1 );
counter++;
printf("Counter value: %d\n",counter);
pthread_mutex_unlock( &mutex1 );
我按原样运行了上面给出的代码,它产生了以下结果:
计数器值:1
计数器值:2
但在第二次运行中,我删除了“pthread_mutex_lock(&mutex1);”和“pthread_mutex_unlock(&mutex1);” .我编译并运行了代码,它再次产生了相同的结果。
现在让我感到困惑的是为什么在上面的代码中使用互斥锁,而没有它也可以完成同样的事情(使用 pthread_join)?如果 pthread_join 阻止另一个线程运行,直到第一个线程完成,那么我认为它已经阻止另一个线程访问计数器值。 pthread_mutex_lock 的目的是什么?
【问题讨论】:
【参考方案1】:连接会阻止启动线程运行(从而终止进程),直到线程 1 和线程 2 完成。它不提供线程1 和线程2 之间的任何同步。互斥锁阻止 thread1 在 thread2 修改计数器时读取计数器,反之亦然。
如果没有互斥锁,最明显的问题是线程 1 和线程 2 完美同步运行。他们每个人都从计数器中读取零,每个人都加一,然后每个人都输出“计数器值:1”。
【讨论】:
但是它们永远不会完美同步运行,因为一个线程必须等到另一个线程完成 pthread_join...我已经测试过...即使线程数量较多,它们也不会遇到每个线程其他只需使用 pthread_join。是否有一些条件,即使调用了 pthread_join,线程也可以同时访问资源? @QandeelAbbasi 只有开始线程调用pthread_join
。 thread1 和 thread2 都没有调用它。唯一等待线程完成的线程是起始线程。此外,两个线程甚至可以在调用 pthread_join
之前运行完成。
@DavidSchwartz,这里的“开始线程”是什么意思?是main函数吗?
@Ac3_DeXt3R 起始线程是调用main
函数的线程。
@DavidSchwartz,所以基本上它是我们运行可执行文件时的主要进程?以上是关于pthread_join 和 pthread_mutex_lock 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
pthread_join和pthread_detach的用法
使用一个参数调用 pthread_join 会导致分段错误?