linux多线程:条件变量

转自 http://blog.csdn.net/hongmy525/article/details/5194006

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;/*初始化互斥锁*/
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;/*初始化条件变量*/
void *thread1(void *);
void *thread2(void *);
int i=1;
int main(void)
{
    pthread_t t_a;
    pthread_t t_b;
    pthread_create(&t_a,NULL,thread1,(void *)NULL);/*创建进程t_a*/
    pthread_create(&t_b,NULL,thread2,(void *)NULL); /*创建进程t_b*/
    pthread_join(t_a, NULL);/*等待进程t_a结束*/
    pthread_join(t_b, NULL);/*等待进程t_b结束*/
    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&cond);
    exit(0);
}
void *thread1(void *junk)
{
    for(i=1;i<=6;i++)
    {
        pthread_mutex_lock(&mutex);/*锁住互斥量*/
  printf("thread1: lock %d/n", __LINE__);
        if(i%3==0){
   printf("thread1:signal 1  %d/n", __LINE__);
            pthread_cond_signal(&cond);/*条件改变,发送信号,通知t_b进程*/
   printf("thread1:signal 2  %d/n", __LINE__);
   sleep(1);
  }
        pthread_mutex_unlock(&mutex);/*解锁互斥量*/
  printf("thread1: unlock %d/n/n", __LINE__);
  sleep(1);
 }
}
void *thread2(void *junk)
{
    while(i<6)
    {
        pthread_mutex_lock(&mutex);
  printf("thread2: lock %d/n", __LINE__);
  if(i%3!=0){
   printf("thread2: wait 1  %d/n", __LINE__);
            pthread_cond_wait(&cond,&mutex);/*解锁mutex,并等待cond改变*/
   printf("thread2: wait 2  %d/n", __LINE__);
  }
        pthread_mutex_unlock(&mutex);
  printf("thread2: unlock %d/n/n", __LINE__);
  sleep(1);
 }
}

编译:

[[email protected] threads]$ gcc thread_cond.c -lpthread -o tcd

以下是程序运行结果:

[[email protected] threads]$ ./tcd  thread1: lock 30 thread1: unlock 40
thread2: lock 52 thread2: wait 1  55 thread1: lock 30 thread1: unlock 40
thread1: lock 30 thread1:signal 1  33 thread1:signal 2  35 thread1: unlock 40
thread2: wait 2  57 thread2: unlock 61
thread1: lock 30 thread1: unlock 40
thread2: lock 52 thread2: wait 1  55 thread1: lock 30 thread1: unlock 40
thread1: lock 30 thread1:signal 1  33 thread1:signal 2  35 thread1: unlock 40
thread2: wait 2  57 thread2: unlock 61

这里的两个关键函数就在pthread_cond_wait和pthread_cond_signal函数。

本例中:
线程一先执行,获得mutex锁,打印,然后释放mutex锁,然后阻塞自己1秒。 线程二此时和线程一应该是并发的执行 ,这里是一个要点,为什么说是线程此时是并发的执行,因为此时不做任何干涉的话,是没有办法确定是线程一先获得执行还是线程二先获得执行,到底那个线程先获得执行,取决于操作系统的调度,想刻意的让线程2先执行,可以让线程2一出来,先sleep一秒。 这里并发执行的情况是,线程一先进入循环,然后获得锁,此时估计线程二执行,阻塞在 pthread_mutex_lock(&mutex); 这行语句中,直到线程1释放mutex锁 pthread_mutex_unlock(&mutex);/*解锁互斥量*/ 然后线程二得已执行,获取metux锁,满足if条件,到pthread_cond_wait (&cond,&mutex);/*等待*/ 这里的线程二阻塞,不仅仅是等待cond变量发生改变,同时释放mutex锁 ,因为当时看书没有注意,所以这里卡了很久。 mutex锁释放后,线程1终于获得了mutex锁,得已继续运行,当线程1的if(i%3==0)的条件满足后,通过pthread_cond_signal发送信号,告诉等待cond的变量的线程(这个情景中是线程二),cond条件变量已经发生了改变。

不过此时线程二并没有立即得到运行 ,因为线程二还在等待mutex锁的释放,所以线程一继续往下走,直到线程一释放mutex锁,线程二才能停止等待,打印语句,然后往下走通过pthread_mutex_unlock(&mutex)释放mutex锁,进入下一个循环。

时间: 2024-12-12 13:59:23

linux多线程:条件变量的相关文章

(转载)Linux 多线程条件变量同步

条件变量是线程同步的另一种方式,实际上,条件变量是信号量的底层实现,这也就意味着,使用条件变量可以拥有更大的自由度,同时也就需要更加小心的进行同步操作.条件变量使用的条件本身是需要使用互斥量进行保护的,线程在改变条件状态之前必须首先锁住互斥量,其他线程在获得互斥量之前不会察觉到这种改变,因为互斥量必须在锁定之后才能计算条件. 模型 #include<pthread.h> pthread_cond_t cond //准备条件变量 pthread_cond_t cond = PTHREAD_CON

笔记3 linux 多线程 条件变量+互斥锁

//cond lock #include<stdio.h> #include<unistd.h> #include<pthread.h> struct test { char a[10]; char b[10]; char c[10]; }yb = {"111","222","33333"}; static int j=0; pthread_mutex_t mutex_1 = PTHREAD_MUTEX_INI

Linux 线程 条件变量

下面是一个多线程,生产者消费者问题,一个队列放暂存的数据: 1 #include <iostream> 2 #include <queue> 3 #include <stdlib.h> 4 #include <unistd.h> 5 #include <pthread.h> 6 7 using std::cout; 8 using std::endl; 9 using std::queue; 10 11 #define N 100 12 #def

Linux线程条件变量成为取消点的陷阱

Linux线程条件变量成为取消点的陷阱 使用 pthread_cancel() 时,线程往往不会直接退出,而需要运行到取消点. pthread_cond_wait() 作为线程常见的一种阻塞,它也是一个取消点.所以,处于条件变量阻塞的线程在接收到取消信号就会直接退出. 然而,由于条件变量需要搭配互斥量使用,进入 pthread_cond_wait() 意味着互斥量上锁,此时退出线程如果不进行解锁,而且同时其他线程正在等待此条件变量,那么就会陷入死锁.因此建议使用cleanup函数在线程退出时对互

C++多线程条件变量

C++多线程中的条件变量的使用. 在多线程编程中,常常使用条件变量来等待某个事件的发生. 先看代码 1 #include <thread> 2 #include <mutex> 3 #include <condition_variable> 4 #include <list> 5 #include <string> 6 #include <iostream> 7 #include <chrono> 8 9 class Ev

C++多线程の条件变量

如果有一个队列,方法一和方法二:方法一是生产者,方法二是消费者: 两者不停的相互等待,加减锁,为了减少不必要的等待,我们可以使用条件变量, 条件的变量的第二个参数的加入可以控制多个线程的"消费"情况

Linux c 条件变量cond的使用记录

条件变量是实现线程间同步的一种方法,条件变量用来自动阻塞一个线程,直到收到收到一个cond信号或其它特殊情况发送,条件变量使用的时候必须与互斥量同时使用,这是为了保证条件量在线程间操作的"原子性". 1.创建一个条件变量cond: int pthread_cond_init(pthread_cond_t * cond, const pthread_condattr_t * attr); 在初始化一个条件变量时如果attr为 NULL,测使用默认值初始化一个条件变量cond,相当于下面的

Linux多线程编程的条件变量

在stackoverflow上看到一关于多线程条件变量的问题,题主问道:什么时候会用到条件变量,mutex还不够吗?有个叫slowjelj的人做了很好的回答,我再看这个哥们其他话题的一些回答,感觉水平好高的.这里把他的回答粘贴一下方便以后查看,原帖在这里:When is a conditional variable needed, isn't a mutex enough? Even though you can use them in the way you describe, mutexes

linux多线程-互斥&amp;条件变量与同步

多线程代码问题描述 我们都知道,进程是操作系统对运行程序资源分配的基本单位,而线程是程序逻辑,调用的基本单位.在多线程的程序中,多个线程共享临界区资源,那么就会有问题: 比如 #include <pthread.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> int g_val = 10; void * test1(void* args) { g_val = 20; printf(&

Linux多线程编程-条件变量

条件变量 如果说线程间的互斥锁是用来同步共享数据的访问的话,那么条件变量是用于线程之间共享数据的值.条件变量提供了一种线程之间的通知机制,当某个共享数据达到某个值时,唤醒等待这个共享数据的线程.条件变量相关函数主要 有5个: #include <pthread.h> int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *cond_attr); int pthread_cond_destroy(pthread_