2.5 linux C 进程与多线程入门--(5)使用互斥量进行同步
互斥:
简单的理解就是一个县城进入工作区之后,如果有其他的线程想要进入工作区,他就会进入等待状态,要等待工作区内的线程结束后才可以进入。
基本函数:
(1)pthread_mutex_init()函数
原型: int pthread_mutex_init(phread_mutex_t *mutex,const pthread_mutexattr_t * attr);
描述:设置互斥性的属性
参数:第一个参数:预先声明的pthread_mutex_t 对象指针
第二个参数:互斥锁属性,null 表示使用默认属性
返回值:成功时返回0,失败时1返回一个错误代码
(2)pthread_mutex_lock()
原型: int pthread_mutex_lock(pthread_mutex_t * mutex);
描述:pthread_mutex_lock返回时,互斥锁被锁定,如果这个互斥锁被一个线程锁定和拥有,那么另一个线程要调用这个函数会进入拥塞状态(即等待状态),直到互斥锁被释放为止。
返回值:成功时,返回0 ,失败时 返回错误代码
(3)pthread_mutex_unlock()函数
原型:int pthread_mutex_unlock(pthread_mutex_t *mutex);
描述:释放互斥锁
返回值:成功时返回0,失败时返回一个错误代码
(4)pthread_mutex_destroy()函数
原型:int pthread_mutex_destroy(pthread_mutex_t * mutex);
描述:删除互斥锁
返回值:成功时返回0 ,失败时返回错误代码
实例:
lock.c文件
描述:这个程序主要可以概括为主线程负责接受输入的字符串,而子线程负责统计并输出字符数。
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<pthread.h>
#include<semaohore.h>
void *thread_function(void * arg);
pthread_mutex_t work_mutex;//创建一个线程变量
#define work_size 1024
char work_area[work_size];
int time_to_exit = 0;
int main()
{
int res;
pthread_t a_thread;
void * thread_result;
//初始化互斥量
res = pthread_mutex_init(&work_mutex,NULL);
if(res != 0)
{
printf("互斥量初始化失败\n");
exit(EXIT_FAILURE);
}
//启动新的线程
res = pthread_create(&a_thread, NULL, thread_function ,NULL);
if(res !=0 )
{
perror("线程创建失败\n");
exit(1);
}
pthread_mutex_lock(&work_mutex);
printf("请输入一些文本,输入end 结束:\n");
while(! time_to_exit)
{
fgets(work_area,work_size,stdin);
pthread_mutex_unlock(&work_mutex);
while(1)
{
pthread_mutex_lock(&work_mutex);
if(work_area[0]!= '\0')
{
pthread_mutex_unlock(&work_mutex);
sleep(1)
}
else
{
break;
}
}
}
pthread_mutex_unlock(&work_mutex);
printf("等待线程结束:...\n");
res = pthread_join(a_thread,&thread_result);
if(res != 0 )
{
perror("thread join failed\n");
exit(1);
}
printf("thread oined\n");
pthread_mutex_destroy(&work_mutex);
exit(1);
}
//主线程首先锁定工作区,在获取输入的字符串后,释放工作区,让其它线程对字符个数进行统计。work_area[0]为字符为空时表示统计结束。通过周期性的对互斥量进行枷锁,检查是否已经统计完。
//在线程中要执行的代码
void *thread_function(void * arg)
{
sleep(1);
pthread_mutex_lock(&work_mutex);
while(strcmp("end",work_area,3)! = 0)
{
printf("你输入了%d个字符\n",strlen(work_area)-1);
work_area[0]= '\0';
pthread_mutex_unlock(&work_mutex);
while(work_area[0]=='\0')
{
thread_mutex_unlock(&work_mutex);
sleep(1);
pthread_mutex_lock(&work_mutex);
}
}
time_to_exit = 1;
work_area[0] = '\0';
pthread_mutex_unlock(&work_mutex);
pthread_exit(0);
}
在新进程一上来之前先试图对互斥量加锁。如果他已经被锁上,新线程就会进入堵塞状态直到互斥锁释放为止,一旦可以进入工作区。
就首先检查是否有退出请求(end)如果有,就设置time_to_exit变量和work_area,然后退出程序。
如果没有退出,那么就对字符个数进行统计,把work_area[0]设置为空,表示统计工作完成,接下来就释放互斥锁,等待主线程的运行,周期性地给互斥量加锁,如果加锁成功,就检查主线程是否又给我们新的字符串统计。如果没有,就释放互斥锁继续等待。
转载于:https://www.cnblogs.com/yjds/p/8598873.html
2.5 linux C 进程与多线程入门--(5)使用互斥量进行同步相关推荐
- c主线程如何等待子线程结束 linux_使用互斥量进行同步 - Linux C进程与多线程入门_Linux编程_Linux公社-Linux系统门户网站...
互斥 简单地理解就是,一个线程进入工作区后,如果有其他线程想要进入工作区,它就会进入等待状态,要等待工作区内的线程结束后才可以进入. 基本函数 (1) pthread_mutex_init函数 原型: ...
- 2.1 linux C 进程与多线程入门--(1)进程和程序的区别
进程和程序的区别: j进程是活动的程序,而程序是一个代码的集合.进程是加载到内存中的程序,而程序没有加载到内存中,只是在磁盘上存储着. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
- Linux Qt使用POSIX多线程条件变量、互斥锁(量)
今天团建,但是文章也要写.酒要喝好,文要写美,方为我辈程序员的全才之路.嘎嘎 之前一直在看POSIX的多线程编程,上个周末结合自己的理解,写了一个基于Qt的用条件变量同步线程的例子.故此来和大家一起分 ...
- windows 多线程(五) 互斥量(Mutex)
参考:http://blog.csdn.net/morewindows/article/details/7470936 互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问.互斥量与关键段的行 ...
- linux守护进程中多线程实现,Linux下实现多线程客户/服务器
在传统的Unix模型中,当一个进程需要由另一个实体执行某件事时,该进程派生(fork)一个子进程,让子进程去进行处理. Unix下的大多数网络服务器程序都是这么编写的,即父进程接受连接,派生子进程,子 ...
- linux c进程线程的面试问题,linux 多线程面试题_linux进程线程_linux 线程 pthread_create...
你写了一个简单的mandelbrot set程序,也就是说用ps命令行是可以看见多个线程,win32里同一个进程里各个线程之间是共享数据段的,win32的进程管理方式与unix上有着很大区别.adob ...
- linux 编程 调度,Linux的进程线程及调度
搜索热词 本文为宋宝华<Linux的进程.线程以及调度>学习笔记. 1 进程概念 1.1 进程与线程的定义 操作系统中的经典定义: 进程:资源分配单位. 线程:调度单位. 操作系统中用PC ...
- linux 只运行一个实例 互斥锁,Linux多线程4-1_互斥量
//包含头文件 int pthread_mutex_destroy(pthread_mutex_t *mutex); int pthread_mutex_init(pthread_mutex_t *r ...
- Linux内核中锁机制之完成量、互斥量
在上一篇博文中笔者分析了关于信号量.读写信号量的使用及源码实现,接下来本篇博文将讨论有关完成量和互斥量的使用和一些经典问题. 八.完成量 下面讨论完成量的内容,首先需明确完成量表示为一个执行单元需要等 ...
最新文章
- C#实现图标批量下载
- 初学者python编辑器-面向初学者的Python编辑器Mu
- HTTPS 原理详解
- mysql 分页 order_Mysql查询使用limit分页,同时使用order by可能产生的问题
- 电脑公司win11旗舰版32位镜像v2021.07
- linux rz sz 安装_Windows与Linux文件传输之lrzsz工具
- python django前端重构_django修改models重建数据库的操作
- MySQL 聚合索引实例_1:mysql 聚合索引
- 有哪些连接oracle的工具,连接oracle数据库工具有哪些
- Android中X5WebView详解
- 朋友圈点赞图在线生成源码
- 电源适配器安规知识简介
- windows7怎么安装android,安卓手机如何装win7系统
- 移动硬盘做PE启动盘的技巧
- 物料移动类型和后勤自动科目设置-转
- 一年中的最后一天说说_2018最后一天感言说说 怎么发朋友圈告别2018年
- j90度度复数运算_虚数i的运算公式及实际意义
- 5GNR中PDCCH的polar编码
- YTU 计算机网络课程设计
- 海驾学车过程全揭秘——第六篇:辛苦的学车全过程