关于线程和条件变量并同步

时间:2018-04-02 08:53:39

标签: c linux synchronization pthreads

我试图理解线程编程中的条件变量,任何人都可以解释它如何与互斥锁一起工作,条件变量是什么,以便它可以同步线程? 条件变量和线程

1 个答案:

答案 0 :(得分:1)

你走了。这里我使用3个互斥锁和3个条件变量。通过以下示例,您可以在C中计划或控制任意数量的线程。首先查看下面的第一个线程。在这里它锁定了互斥锁lock1(以便其他线程无法访问代码)开始执行(代码未添加只是注释),最后在完成等待cond1的任务后,同样第二个线程锁定互斥锁lock2,开始执行其业务逻辑并最终等待在条件cond2和第三个线程锁定互斥锁lock3,开始执行其业务逻辑,最后等待条件cond3。我不是在这里添加任何业务逻辑,因为这只是一个例子。在注释部分中,您可以添加将以并行模式执行的业务逻辑。假设thread3依赖于将要插入表中的thread1的最终输出,而thread3将在创建最终结果之前读取该信息,而thread2依赖于thread3的最终结果来生成其最终结果。因此,在将数据插入表之后,thread1通过条件变量发出信号以继续其最终过程。这意味着thread1控制thread3。由于thread2依赖于thread3的最终结果,因此thread3控制Thread2的执行。这里我们可以允许thread1独立执行,因为它的操作不依赖于任何其他线程,但是例如线程控制我们在这里控制所有线程,因此thread1是从thread2控制的。

要开始控制过程,我们首先发布thread1。在主线程中(即main函数,每个程序都有一个主线程,在C / C ++中,一旦控件通过内核传递给main方法/函数,这个主线程由操作系统自动创建)我们调用pthread_cond_signal(& cond1) );一旦从主线程调用此函数,将释放在cond1上等待的thread1,它将继续执行。一旦完成最后的任务,它将调用pthread_cond_signal(& cond3);现在正在等待条件cond3的线程,即thread3将被释放,它将开始执行它的最后阶段,并将调用pthread_cond_signal(& cond2);并且它将释放在条件cond2上等待的线程,即在这种情况下为thread2。这是我们在多线程环境中调度和控制线程执行的方式。

#include<pthread.h>

pthread_cond_t cond1 = PTHREAD_COND_INITIALIZER;
pthread_cond_t cond2 = PTHREAD_COND_INITIALIZER;
pthread_cond_t cond3 = PTHREAD_COND_INITIALIZER;
pthread_mutex_t lock1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t lock2 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t lock3 = PTHREAD_MUTEX_INITIALIZER;

int TRUE = 1;

void * threadMethod1(void *arg)
{
  printf("In thread1\n");
  do{
    pthread_mutex_lock(&lock1);
    //Add your business logic(parallel execution codes)  here
    pthread_cond_wait(&cond1, &lock1);
    printf("I am thread1  generating the final report and inserting into a table \n");
    pthread_cond_signal(&cond3);/* Now allow 3rd thread to process */
    pthread_mutex_unlock(&lock1);
  }while(TRUE);
  pthread_exit(NULL);
}

void * threadMethod2(void *arg)
{
  printf("In thread2\n");
  do
  {
    pthread_mutex_lock(&lock2);
    //Add your business logic(parallel execution codes)  here
    pthread_cond_wait(&cond2, &lock2);
    printf("I am thread2  generating the final report and inserting into a table \n");
    pthread_cond_signal(&cond1);
    pthread_mutex_unlock(&lock2);
  }while(TRUE);
  pthread_exit(NULL);
}

void * threadMethod3(void *arg)
{
  printf("In thread3\n");
  do
  {
    pthread_mutex_lock(&lock3);
    //Add your business logic(parallel execution codes)  here
    pthread_cond_wait(&cond3, &lock3);
    printf("I am thread3  generating the final report and inserting into a table \n");
    pthread_cond_signal(&cond2);
    pthread_mutex_unlock(&lock3);
  }while(TRUE);
  pthread_exit(NULL);
}

int main(void)
{
  pthread_t tid1, tid2, tid3;
  int i = 0;

  printf("Before creating the threads\n");
  if( pthread_create(&tid1, NULL, threadMethod1, NULL) != 0 )
        printf("Failed to create thread1\n");
  if( pthread_create(&tid2, NULL, threadMethod2, NULL) != 0 )
        printf("Failed to create thread2\n");
  if( pthread_create(&tid3, NULL, threadMethod3, NULL) != 0 )
        printf("Failed to create thread3\n");
  pthread_cond_signal(&cond1);/* Now allow first thread to process first */


  sleep(1);
  TRUE = 0;/* Stop all the thread */
  sleep(3);

 /* this is how we join thread before exit from a system */
  /*  
  pthread_join(tid1,NULL);
  pthread_join(tid2,NULL);
  pthread_join(tid3,NULL);*/

 exit(0);
}