关于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;
}
通过上面的代码我们可以很清楚的知道互斥锁和条件变量的用法,我认为互斥锁和条件变量主要用于多个线程之间有资源的互相依赖,或者可以认为他们之间有共享源的逻辑关系。必须使用互斥锁和条件变量。
- 关于linux下互斥锁和条件变量的理解
- linux下互斥锁和条件变量的使用
- 关于条件变量的一点理解
- 理解 Linux 条件变量
- 理解 Linux 条件变量
- 理解 Linux 条件变量
- 关于linux条件变量的一点思考
- 条件变量的理解
- linux的条件变量和时间编程
- linux互斥锁和条件变量的关系
- Linux中互斥锁和条件变量的配合
- Linux下多线程之条件变量的个人理解
- 互斥锁与条件变量的配合! (关于互斥锁和条件变量分析的比较透彻)
- linux互斥锁和条件变量
- Linux互斥锁和条件变量
- Linux线程通信条件变量理解
- 关于条件变量的讨论
- 关于条件变量和互斥锁为何配合使用的思考
- Configuring HiveServer2 for CDH
- Problem B
- 基础回顾——Java对象创建、内存分配、访问定位概述
- 第十八章——触摸事件和UIResponder
- 【转】React Native 中组件的生命周期
- 关于linux下互斥锁和条件变量的理解
- go语言获取新浪Cookie
- Arpa's weak amphitheater and Mehrdad's valuable Hoses
- sql中drop、truncate和delete的区别
- openCv+Java实现人脸剪切
- AndroidStudio svn 上传不了.so 文件 .a文件
- Include动态指令和静态指令的区别
- 获取动态添加的节点的ID
- super.onDestroy(); 应该放在第一行还是放在最后一行?为什么?