互斥锁和pthread_join之间的区别

时间:2011-05-19 03:29:57

标签: c multithreading pthreads

两者之间有什么区别?

在执行另一个线程之前,它们是否都等待线程完成它们是不是一样?

我正在尝试理解以下代码

#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(0);
}    
void *functionC()
{
   pthread_mutex_lock( &mutex1 );
   counter++;
   printf("Counter value: %d\n",counter);
   pthread_mutex_unlock( &mutex1 );
}

感谢。

2 个答案:

答案 0 :(得分:10)

他们实际上并不是一回事。

互斥(互斥信号量)是一种将资源的使用限制为一次一个线程的方法(两个线程显然都能够运行)。当一个线程从pthread_mutex_lock调用成功返回时,它保证是唯一持有该锁的线程。尝试在该点之后锁定该互斥锁的任何线程通常必须等到拥有线程解锁它。

换句话说,带锁的线程是唯一能够操纵受该锁保护的资源的线程(当然,假设其他线程在没有首先获取锁的情况下不接触资源 - 你必须要玩按照规则)。

另一方面,pthread_join允许线程等待另一个线程退出。这通常在主线程中用于等待所有子线程退出(还有其他用途,这只是一个典型的用途)。从pthread_join成功返回意味着另一个线程不再运行。

在您显示的代码中,两个线程同时运行,counter增量和printf调用都受mutex1保护。 pthread_join末尾的main调用将使主线程等待,直到您的两个子线程退出,然后继续。

另外,您应该检查pthread_mutex_lock的返回值,因为它可以失败。在这种情况下,您可能不希望继续修改受保护资源,因为可能会发生损坏。同上pthread_join

而且,对于更全面的测试,以下功能会更好:

void *functionC() {
    int i;
    for (i = 1000; i > 0; i--) {
        pthread_mutex_lock (&mutex1);
        counter++;
        printf ("Counter value: %d\n", counter);
        pthread_mutex_unlock (&mutex1);
    }
}

因为它更可能让线程并排运行。如果没有循环,一个线程很可能会在第二个线程开始之前退出。

答案 1 :(得分:3)

pthread_join()等待线程退出。 mutex_lock获取对信号量的控制,该信号量阻止协作线程同时访问受保护资源。