美文网首页
Linux C 线程的互斥锁和条件变量

Linux C 线程的互斥锁和条件变量

作者: itfitness | 来源:发表于2022-02-07 14:53 被阅读0次

这里简单的做了一个生产消费的案例,方便记忆

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>

#define NUM 10

static int s = 0;
static pthread_cond_t cond_add,cond_sub;
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void* add(void* params){
        int i = 0;
        for(i = 0 ; i < NUM ; i++){
                pthread_mutex_lock(&mutex);
                while(s > 0){
                        pthread_cond_wait(&cond_add, &mutex);
                }
                s++;
                printf("生产一个\n");
                pthread_cond_signal(&cond_sub);
                pthread_mutex_unlock(&mutex);
        }
        pthread_mutex_lock(&mutex);
        while(s > 0){
                pthread_cond_wait(&cond_add, &mutex);
        }
        s = -1;
        pthread_cond_signal(&cond_sub);
        pthread_mutex_unlock(&mutex);
        printf("生产线程结束\n");
        pthread_exit(0);
}
void* sub(void* params){
        while(s >= 0){
                pthread_mutex_lock(&mutex);
                while(s == 0){
                        pthread_cond_wait(&cond_sub, &mutex);
                }
                if(s < 0){
                        pthread_mutex_unlock(&mutex);
                        break;
                }
                s--;
                printf("消费一个\n");
                pthread_cond_signal(&cond_add);
                pthread_mutex_unlock(&mutex);
        }
        printf("消费线程结束\n");
        pthread_exit(0);
}

int main(){
        pthread_t p1,p2;
        void * res;

        //初始化条件变量
        pthread_cond_init(&cond_add, NULL);
        pthread_cond_init(&cond_sub, NULL);

        //创建线程
        pthread_create(&p1,NULL,add,NULL);
        pthread_create(&p2,NULL,sub,NULL);

        //等待线程结束
        pthread_join(p1, &res);
        pthread_join(p2, &res);

        //释放资源
        pthread_cond_destroy(&cond_add);
        pthread_cond_destroy(&cond_sub);
        pthread_mutex_destroy(&mutex);

        exit(0);
}

相关文章

  • 线程同步与互斥

    Linux--线程编程 多线程编程-互斥锁 线程同步与互斥 互斥锁 信号量 条件变量 互斥锁 互斥锁的基本使用...

  • Linux线程同步

    Linux下提供了多种方式来处理线程同步,最常用的是互斥锁、条件变量和信号量。 Linux线程同步-----互斥锁...

  • Linux C 线程的互斥锁和条件变量

    这里简单的做了一个生产消费的案例,方便记忆

  • Linux系统编程—条件变量

    条件变量是用来等待线程而不是上锁的,条件变量通常和互斥锁一起使用。条件变量之所以要和互斥锁一起使用,主要是因为互斥...

  • linux常见的三种线程同步方式是什么?

    Linux系统中,实现线程同步的方式大致分为六种,其中包括:互斥锁、自旋锁、信号量、条件变量、读写锁、屏障。其中最...

  • 【第58天】python全栈从入门到放弃

    1 递归锁Rlock()和互斥锁 递归锁 互斥锁 2 条件Condition 条件的例子 3 守护进程和守护线程与...

  • 33.python 线程信号量semaphore

      通过前面对 线程互斥锁lock / 线程事件event / 线程条件变量condition / 线程定时器t...

  • 条件变量

    条件变量: 条件变量本身不是锁!但它也可以造成线程阻塞。通常与互斥锁配合使用。给多线程提供一个会合的场所。为什么有...

  • 多线程同步

    1.linux使用多线程同步的方法 1)互斥锁:当线程A锁定了互斥变量时,线程B再去锁定时就会被挂起,直到A解锁。...

  • 2019-07-23

    线程同步 互斥量mutex,读写锁rwlock,条件变量cond demo:https://www.jianshu...

网友评论

      本文标题:Linux C 线程的互斥锁和条件变量

      本文链接:https://www.haomeiwen.com/subject/kjymkrtx.html