pthread的条件变量初探

本期研究一下Pthreads的条件变量。从网上找到了一个学习笔记,请看“cnblogs-blueclue‘s tech blog-POSIX线程库条件变量的使用--Pthreads线程库实例笔记4”。

在windows上测试了一下该代码,稍作改动, 粘贴如下:

其中有几点需要注意:

  1. 延时函数是Sleep(),在头文件<windows.h>中。该函数用于延时某一线程的执行;
  2. 轮询次数设置为while循环的条件,在信号发送和接受函数中,轮询次数应当保持一致;
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>

int count = 0;

pthread_cond_t count_threshold_cv;
pthread_mutex_t count_mutex;

void * watch_count(void *t){

    long my_id = (long) t;

    while(count < 15){
        pthread_mutex_lock(&count_mutex);
        printf("Starting watch_count(): thread %ld\n", my_id);
        printf("watch_count(): thread %ld going into wait ...\n", my_id);
        pthread_cond_wait(&count_threshold_cv, &count_mutex);
        /*suspend execution for an interval of time*/
        //Sleep(100000);
        printf("watch_count(): thread %ld condition signal received.\n", my_id);
        printf("watch_count(): thread %ld count now = %d.\n", my_id, count);
        pthread_mutex_unlock(&count_mutex);
    }
    pthread_exit(NULL);
}

void * inc_count(void *t){

    long my_id = (long) t;

    while(count < 15){
        pthread_mutex_lock(&count_mutex);
        count++;
        if(count > 10){
            printf("inc_count(): thread %ld, count = %d Threshold reached", my_id, count);
            pthread_cond_signal(&count_threshold_cv);
            printf("Just sent signal.\n");
        }
        printf("inc_count(): thread %ld, count = %d, unlocking mutex\n", my_id, count);
        pthread_mutex_unlock(&count_mutex);
    }
    pthread_exit(NULL);
}

int main(){
    pthread_t threads[3];
    pthread_mutex_init(&count_mutex, NULL);
    pthread_cond_init(&count_threshold_cv, NULL);

    long t1 = 1, t2 = 2, t3 = 3;
    pthread_create(&threads[0], NULL, watch_count, (void *) t1);
    pthread_create(&threads[1], NULL, inc_count, (void *) t2);
    pthread_create(&threads[2], NULL, inc_count, (void *) t3);

    for(int i = 0; i < 3; i++){
        pthread_join(threads[i], NULL);
    }

    pthread_mutex_destroy(&count_mutex);
    pthread_cond_destroy(&count_threshold_cv);
    pthread_exit(NULL);
    return 0;
}
时间: 2024-08-24 20:06:20

pthread的条件变量初探的相关文章

转载~kxcfzyk:Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解

Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解 多线程c语言linuxsemaphore条件变量 (本文的读者定位是了解Pthread常用多线程API和Pthread互斥锁,但是对条件变量完全不知道或者不完全了解的人群.如果您对这些都没什么概念,可能需要先了解一些基础知识) 关于条件变量典型的实际应用,可以参考非常精简的Linux线程池实现(一)——使用互斥锁和条件变量,但如果对条件变量不熟悉最好先看完本文. Pthread库的条件变量机制的主要API有三个: int p

Linux互斥锁、条件变量和信号量

Linux互斥锁.条件变量和信号量  来自http://kongweile.iteye.com/blog/1155490 博客分类: Linux sem_init:初始化信号量sem_t,初始化的时候可以指定信号量的初始值,以及是否可以在多进程间共享.sem_wait:一直阻塞等待直到信号量>0.sem_timedwait:阻塞等待若干时间直到信号量>0.sem_post:使信号量加1.sem_destroy:释放信号量.和sem_init对应. 进行多线程编程,最应该注意的就是那些共享的数据

【C/C++多线程编程之八】pthread条件变量

多线程编程之条件变量 Pthread是 POSIX threads 的简称,是POSIX的线程标准. 互斥机制,包括互斥量[C/C++多线程编程之六]pthread互斥量,信号量[C/C++多线程编程之七]pthread信号量,互斥能很好的处理共享资源访问的协调问题,是多线程同步必不可少的机制.互斥机制也有其缺陷,当线程在等待共享资源满足某个条件,互斥机制下,必须不断地加锁和解锁,其间查询共享资源是否满足条件,这将带来巨大的消耗.         此时,需要新的机制来解决这个问题.      

pThread线程(三) 线程同步--条件变量

条件变量(Condition Variables) 参考资料:http://game-lab.org/posts/posix-thread-cn/#5.1 条件变量是什么? 条件变量为我们提供了另一种线程间同步的方法,然而,互斥量是通过控制线程访问数据来实现同步,条件变量允许线程同步是基于实际数据的值. 如果没有条件变量,程序员需要让线程不断地轮询,以检查是否满足条件.由于线程处在一个不间断的忙碌状态,所以这是相当耗资源的.条件变量就是这么一个不需要轮询就可以解决这个问题的方法. 条件变量总是跟

pthread条件变量属性

一:条件变量属性 pthread_condattr_init 语法 int pthread_condattr_init(pthread_condattr_t *cattr); #include <pthread.h> pthread_condattr_t cattr; int ret; /* initialize an attribute to default value */ ret = pthread_condattr_init(&cattr); 调用此函数时,pshared 属性

互斥锁和条件变量(pthread)相关函数

互斥锁 #include <pthread.h> // 若成功返回0,出错返回正的Exxx值 // mptr通常被初始化为PTHREAD_MUTEX_INITIALIZER int pthread_mutex_lock(pthread_mutex_t *mptr); int pthread_mutex_trylock(pthread_mutex_t *mptr); // pthread_mutex_lock 函数的非阻塞模式 int pthread_mutex_unlock(pthread_m

条件变量函数

#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; in

C++11并行编程-条件变量(condition_variable)详细说明

<condition_variable >头文件主要包含有类和函数相关的条件变量. 包括相关类 std::condition_variable和 std::condition_variable_any,还有枚举类型std::cv_status.另外还包含函数 std::notify_all_at_thread_exit(),以下分别介绍一下以上几种类型. std::condition_variable 类介绍 std::condition_variable是条件变量,很多其它有关条件变量的定义

线程通信(二)—— 条件变量

上篇提到线程针对临界值操作时需要加锁,但是线程访问临界资源只通过锁来控制是不够的. 比如对一个数据进行操作,A线程需要读,B线程进行写. A线程先访问临界资源,发现没有数据可以读,只能等待B线程先写,此时又占用了互斥锁,导致B线程无法得到锁,进行写操作. 此时就需要用到条件变量了,条件变量的目的就是控制线程的先后执行,保证临界资源的有效性. 下面依然是售票的一个场景,此时一个线程售票,一个线程退票. 1 #include <pthread.h> 2 #include <unistd.h&