什么是pthread_join和pthread_mutex_lock之间的区别?

时间:2015-10-02 17:10:14

标签: pthreads ubuntu-12.04 mutex pthread-join

以下代码来自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(&amp; mutex1);”和“pthread_mutex_unlock(&amp; mutex1);” 。我编译并运行代码,它再次产生了相同的结果。

现在让我感到困惑的是为什么在没有它的情况下使用pthread_join可以在上面的代码中使用互斥锁?如果pthread_join阻止另一个线程运行,直到第一个完成,那么我认为它已经阻止了另一个线程访问计数器值。什么是pthread_mutex_lock的目的?

1 个答案:

答案 0 :(得分:4)

连接阻止启动线程运行(从而终止进程),直到thread1和thread2完成。它不提供 thread1和thread2之间的任何同步。当thread2修改时,互斥锁阻止thread1读取计数器,反之亦然。

没有互斥锁,最明显的可能出错的是thread1和thread2完美同步。它们每个从计数器读取零,每个都加一个,每个输出“计数器值:1”。