关于linux下互斥锁和条件变量的理解

来源:互联网 发布:免费vpn软件下载 编辑:程序博客网 时间:2024/06/14 03:11

首先我的理解什么是互斥锁,什么是条件变量,他们的作用是什么?

互斥锁:可以理解为它本身是一把锁,用于对资源进行保护。

条件变量:是利用线程间共享的全局变量进行同步的一中机制。主要包括两个动作:个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。 

对于互斥锁的创建主要分为以下几步:1.声明互斥锁:pthread_mutex_t lock;

                                                              2.初始化互斥锁:pthread_mutex_init (&lock, NULL);

                                                              3.上锁: pthread_mutex_lock (&lock);

                                                              4.通过条件变量唤醒互斥锁:pthread_cond_wait (&cond, &lock);

                                                              5.解锁:pthread_mutex_unlock (&lock);

                                                              6.销毁锁:pthread_mutex_destroy (&lock);


对于条件变量的创建主要分为以下几步:1.声明条件变量:pthread_cond_t cond;

                                                                 2.初始化条件变量:pthread_cond_init (&cond, NULL);

                                                                 3.唤醒指定的线程: pthread_cond_signal(&cond);

                                                                 4.通过条件变量唤醒互斥锁:pthread_cond_wait (&cond, &mutex);                                                                                 5.销毁条件变量:pthread_cond_destroy (&cond);


下面结合代码理解一下互斥锁和条件变量:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>//无名信号量头文件


char buf[32] = "hello";
pthread_cond_t cond;
pthread_mutex_t lock;


//线程的主体
void * handler(void *arg)
{
while (1)
{
//从终端读入字符串
fgets(buf, 32, stdin);
//唤醒指定的线程
pthread_cond_signal(&cond);
}


pthread_exit(0);//仅仅结束线程,但是不会影响进程
}


void * handler_1(void *arg)
{
while (1)
{
//线程的睡眠
pthread_mutex_lock(&lock);
pthread_cond_wait(&cond, &lock);
printf("%s\n", buf);
pthread_mutex_unlock(&lock);
}
pthread_exit(0);
}


int main(int argc, const char *argv[])
{
pthread_t thread, thread_1;//定义一个线程标识符


//初始化条件变量
pthread_cond_init(&cond, NULL);
pthread_mutex_init(&lock, NULL);


if (pthread_create(&thread, NULL, handler, NULL) != 0)
{
perror("fail to pthread_create");
exit(1);
}


if (pthread_create(&thread_1, NULL, handler_1, NULL) != 0)
{
perror("fail to pthread_create");
exit(1);
}


pthread_join(thread, NULL);
pthread_join(thread_1, NULL);
//销毁条件变量
pthread_cond_destroy(&cond);
pthread_mutex_destroy(&lock);
return 0;
}

             

通过上面的代码我们可以很清楚的知道互斥锁和条件变量的用法,我认为互斥锁和条件变量主要用于多个线程之间有资源的互相依赖,或者可以认为他们之间有共享源的逻辑关系。必须使用互斥锁和条件变量。                                              


  


原创粉丝点击