linux多线程编程---条件变量

来源:互联网 发布:c语言函数库详解 编辑:程序博客网 时间:2024/04/28 20:01


pthread_cond_wait(&cond, &mutex) 线程解开mutex指向的锁并被条件变量cond阻塞
pthread_cond_signal(&cond)  释放阻塞在条件变量(cond)上的线程


#include <pthread.h>
#include <string.h>
#include <errno.h>
#include <iostream>
using std::cout;
using std::endl;

pthread_mutex_t mutex;
static pthread_cond_t cond;/* 不能由多个线程同时初始化一个条件变量 */
int cnt = 0;
int estatus = -1;

void *run1(void *);
void *run2(void *);

int main()
{
        pthread_mutex_init(&mutex, NULL);
        pthread_cond_init(&cond, NULL); /* 缺省属性,只适用于同一个进程中的多线程 */

        pthread_t tid1, tid2;

        int ret = pthread_create(&tid1, NULL, run1, NULL);
        if (0 != ret)
                cout << "Create Thread1 Failed " << strerror(errno) << endl;
        ret = pthread_create(&tid2, NULL, run2, NULL);
        if (0 != ret)
                cout << "Create Thread2 Failed " << strerror(errno) << endl;

        sleep(5);

        pthread_join(tid1, NULL);
        pthread_join(tid2, NULL);

        pthread_mutex_destroy(&mutex);
        pthread_cond_destroy(&cond);

        return 0;
}

void *run1(void *arg)
{
        pthread_mutex_lock(&mutex);
        cout << "Thread1 begin-------" << cnt << endl;
        /* 阻塞在 cond 上的线程被唤醒以后,直到pthread_cond_wait()函数返回之前
cnt 都有可能发生变化,所以需要重新测试条件 */
        while (0 == cnt)
        {
                cout << "Thread1 wait-----" << endl;
                pthread_cond_wait(&cond, &mutex);
        }
        --cnt;
        cout << "Thread1 --cnt = " << cnt << endl;
        pthread_mutex_unlock(&mutex);
        cout << "Thread1 end-------" << cnt << endl;
        return &estatus;
}

void *run2(void *arg)
{
        pthread_mutex_lock(&mutex);
        cout << "Thread2 begin------" << cnt << endl;
        if (0 == cnt)
        {
                cout << "Thread2 send signal" << endl;
                pthread_cond_signal(&cond);
        }
        ++cnt;
        cout << "Thread2 ++cnt = " << cnt << endl;
        pthread_mutex_unlock(&mutex);
        cout << "Thread2 end-----" << cnt << endl;
        return &estatus;
}

--------------------------

/*
 是否熟悉POSIX多线程编程技术?如熟悉,编写程序完成如下功能:
  1)有一int型全局变量g_Flag初始值为0;
  2)在主线称中起动线程1,打印“this is thread1”,并将g_Flag设置为1
  3)在主线称中启动线程2,打印“this is thread2”,并将g_Flag设置为2
  4)线程序1需要在线程2退出后才能退出
  5)主线程在检测到g_Flag从1变为2,或者从2变为1的时候退出
*/

#include <pthread.h>
#include <errno.h>
#include <string.h> /* strerror */
#include <stdlib.h> /* exit */
#include <iostream>
using std::cout;
using std::endl;

void *run1(void *);
void *run2(void *);

static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

int nFlag = 0;

void *run1(void *arg)
{
        pthread_mutex_lock(&mutex);
        cout << "Thread1 nFlag = " << nFlag << endl;
        if (2 == nFlag)
        {
                pthread_cond_signal(&cond);
                cout << "Thread1 send signal  2--->1" << endl;
        }
        nFlag = 1;
        cout << "Thread1 In Locked--> nFlag = " << nFlag << endl;
        pthread_mutex_unlock(&mutex);
        cout << "Thread1 terminated" << endl;
        pthread_exit(0);
}

void *run2(void *arg)
{
        pthread_mutex_lock(&mutex);
        cout << "Thread2 nFlag = " << nFlag << endl;
        if (1 == nFlag)
        {
                pthread_cond_signal(&cond);
                cout << "Thread2 send signal 1--->2" << endl;
        }
        nFlag = 2;
        cout << "Thread2 In Locked--> nFlag = " << nFlag << endl;
        pthread_mutex_unlock(&mutex);
        //pthread_join(*(pthread_t *)arg, NULL);
        cout << "Thread2 terminated" << endl;
        pthread_exit(0);
}

int main()
{
        pthread_t tid1, tid2;
        int ret;
        ret = pthread_create(&tid1, NULL, run1, NULL);
        if (ret)
                cout << "Create Thread1 Fail error = " << errno << "->"<< strerror(errno) << endl;
        ret = pthread_create(&tid2, NULL, run2, NULL);
        if (ret)
                cout << "Create Thread2 Fail error = " << errno << "->" << strerror(errno) << endl;
        pthread_cond_wait(&cond, &mutex);

        pthread_join(tid1, NULL);
        pthread_join(tid2, NULL);
        cout << "main thread terminated" << endl;
        exit(0);
}