Linux线程间通信之信号量

本程序通过用四个线程输出从1~100的方式来展示在进行多线程编程的时候,对于信号量和互斥量的使用。

程序代码:

/**
 * @file LinuxMultiThread.cpp
 * @author DennisMi (https://www.dennisthink.com/)
 * @brief Linux多线程演示代码,使用4个线程打印从1~100
 * @version 0.1
 * @date 2020-06-02
 * 
 * @copyright Copyright (c) 2020
 * 
 */

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h>
#include <errno.h>
#include <unistd.h>
#include <iostream>

typedef void * (*pThreadFun)(void *);

static pthread_cond_t cond1=PTHREAD_COND_INITIALIZER;
static pthread_cond_t cond2=PTHREAD_COND_INITIALIZER;
static pthread_cond_t cond3=PTHREAD_COND_INITIALIZER;
static pthread_cond_t cond4=PTHREAD_COND_INITIALIZER;
static pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t mutex3 = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t mutex4 = PTHREAD_MUTEX_INITIALIZER;
void * Thread1(void *)
{
    static int nCount = 1;
    
    while(nCount <= 100)
    {
        pthread_mutex_lock(&mutex1);
        pthread_cond_wait(&cond1,&mutex1);
        std::cout<<"Thread Id "<<pthread_self()<<"  Value: "<<nCount<<std::flush<<std::endl;
        nCount +=4;
        pthread_mutex_unlock(&mutex1);
        pthread_cond_signal(&cond2);
    }
}

void * Thread2(void *)
{
    static int nCount = 2;
    
    while(nCount <= 100)
    {
        pthread_mutex_lock(&mutex2);
        pthread_cond_wait(&cond2,&mutex2);
        std::cout<<"Thread Id "<<pthread_self()<<"  Value: "<<nCount<<std::flush<<std::endl;
        nCount +=4;
        pthread_mutex_unlock(&mutex2);
        pthread_cond_signal(&cond3);
    }
}

void * Thread3(void *)
{
    static int nCount = 3;
    
    while(nCount <= 100)
    {
        pthread_mutex_lock(&mutex3);
        pthread_cond_wait(&cond3,&mutex3);
        std::cout<<"Thread Id "<<pthread_self()<<"  Value: "<<nCount<<std::flush<<std::endl;
        nCount +=4;
        pthread_mutex_unlock(&mutex3);
        pthread_cond_signal(&cond4);
    }
}

void * Thread4(void *)
{
    static int nCount = 4;
    while(nCount <= 100)
    {
        pthread_mutex_lock(&mutex4);
        pthread_cond_wait(&cond4,&mutex4);
        std::cout<<"Thread Id "<<pthread_self()<<"  Value: "<<nCount<<std::flush<<std::endl;
        nCount +=4;
        pthread_mutex_unlock(&mutex4);
        pthread_cond_signal(&cond1);
    }
}

int main(int argc, char* argv[])
{
    {
        pthread_cond_init(&cond1, NULL);
        pthread_cond_init(&cond2, NULL);
        pthread_cond_init(&cond3, NULL);
        pthread_cond_init(&cond4, NULL);
    }
    {
        pthread_mutex_init(&mutex1,NULL);
        pthread_mutex_init(&mutex2,NULL);
        pthread_mutex_init(&mutex3,NULL);
        pthread_mutex_init(&mutex4,NULL);
    }
    pthread_t threadId1;
    int nRC1 = pthread_create(&threadId1, NULL,Thread1,NULL);
    if(nRC1 == 0)
    {
        std::cout<<"Create Thread1 Succeed"<<std::endl;
    }
    else
    {
        exit(1);
    }
    
    pthread_t threadId2;
    int nRC2 = pthread_create(&threadId2, NULL,Thread2,NULL);
    if(nRC2 == 0)
    {
        std::cout<<"Create Thread2 Succeed"<<std::endl;
    }
    else
    {
        exit(1);
    }
    
    pthread_t threadId3;
    int nRC3 = pthread_create(&threadId3, NULL,Thread3,NULL);
    if(nRC3 == 0)
    {
        std::cout<<"Create Thread3 Succeed"<<std::endl;
    }
    else
    {
        exit(1);
    }

    pthread_t threadId4;
    int nRC4 = pthread_create(&threadId4, NULL,Thread4,NULL);
    if(nRC4 == 0)
    {
        std::cout<<"Create Thread4 Succeed"<<std::endl;
    }
    else
    {
        exit(1);
    }
    sleep(2);
    pthread_cond_signal(&cond1);
    sleep(20);
    return 0;
}

效果演示:

参考资料: Linux多线程编程