互斥:

简单的理解就是一个县城进入工作区之后,如果有其他的线程想要进入工作区,他就会进入等待状态,要等待工作区内的线程结束后才可以进入。

基本函数:

(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)使用互斥量进行同步相关推荐

  1. c主线程如何等待子线程结束 linux_使用互斥量进行同步 - Linux C进程与多线程入门_Linux编程_Linux公社-Linux系统门户网站...

    互斥 简单地理解就是,一个线程进入工作区后,如果有其他线程想要进入工作区,它就会进入等待状态,要等待工作区内的线程结束后才可以进入. 基本函数 (1) pthread_mutex_init函数 原型: ...

  2. 2.1 linux C 进程与多线程入门--(1)进程和程序的区别

    进程和程序的区别: j进程是活动的程序,而程序是一个代码的集合.进程是加载到内存中的程序,而程序没有加载到内存中,只是在磁盘上存储着. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

  3. Linux Qt使用POSIX多线程条件变量、互斥锁(量)

    今天团建,但是文章也要写.酒要喝好,文要写美,方为我辈程序员的全才之路.嘎嘎 之前一直在看POSIX的多线程编程,上个周末结合自己的理解,写了一个基于Qt的用条件变量同步线程的例子.故此来和大家一起分 ...

  4. windows 多线程(五) 互斥量(Mutex)

    参考:http://blog.csdn.net/morewindows/article/details/7470936 互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问.互斥量与关键段的行 ...

  5. linux守护进程中多线程实现,Linux下实现多线程客户/服务器

    在传统的Unix模型中,当一个进程需要由另一个实体执行某件事时,该进程派生(fork)一个子进程,让子进程去进行处理. Unix下的大多数网络服务器程序都是这么编写的,即父进程接受连接,派生子进程,子 ...

  6. linux c进程线程的面试问题,linux 多线程面试题_linux进程线程_linux 线程 pthread_create...

    你写了一个简单的mandelbrot set程序,也就是说用ps命令行是可以看见多个线程,win32里同一个进程里各个线程之间是共享数据段的,win32的进程管理方式与unix上有着很大区别.adob ...

  7. linux 编程 调度,Linux的进程线程及调度

    搜索热词 本文为宋宝华<Linux的进程.线程以及调度>学习笔记. 1 进程概念 1.1 进程与线程的定义 操作系统中的经典定义: 进程:资源分配单位. 线程:调度单位. 操作系统中用PC ...

  8. linux 只运行一个实例 互斥锁,Linux多线程4-1_互斥量

    //包含头文件 int pthread_mutex_destroy(pthread_mutex_t *mutex); int pthread_mutex_init(pthread_mutex_t *r ...

  9. Linux内核中锁机制之完成量、互斥量

    在上一篇博文中笔者分析了关于信号量.读写信号量的使用及源码实现,接下来本篇博文将讨论有关完成量和互斥量的使用和一些经典问题. 八.完成量 下面讨论完成量的内容,首先需明确完成量表示为一个执行单元需要等 ...

最新文章

  1. C#实现图标批量下载
  2. 初学者python编辑器-面向初学者的Python编辑器Mu
  3. HTTPS 原理详解
  4. mysql 分页 order_Mysql查询使用limit分页,同时使用order by可能产生的问题
  5. 电脑公司win11旗舰版32位镜像v2021.07
  6. linux rz sz 安装_Windows与Linux文件传输之lrzsz工具
  7. python django前端重构_django修改models重建数据库的操作
  8. MySQL 聚合索引实例_1:mysql 聚合索引
  9. 有哪些连接oracle的工具,连接oracle数据库工具有哪些
  10. Android中X5WebView详解
  11. 朋友圈点赞图在线生成源码
  12. 电源适配器安规知识简介
  13. windows7怎么安装android,安卓手机如何装win7系统
  14. 移动硬盘做PE启动盘的技巧
  15. 物料移动类型和后勤自动科目设置-转
  16. 一年中的最后一天说说_2018最后一天感言说说 怎么发朋友圈告别2018年
  17. j90度度复数运算_虚数i的运算公式及实际意义
  18. 5GNR中PDCCH的polar编码
  19. YTU 计算机网络课程设计
  20. 海驾学车过程全揭秘——第六篇:辛苦的学车全过程

热门文章

  1. 国家卫健委:我国男女性成人平均身高分别为169.7厘米和158厘米
  2. Python3编程语言之zip() 函数使用示例
  3. 计算机视觉领域最全汇总(第2部分)
  4. c++面试题之标准模板库
  5. echarts一个页面有多个tooltip_可视化工具ECharts入门
  6. mysql多行合并成一行_数据文件合并与拆分
  7. 50个直击灵魂的问题_直击保险人灵魂的五个问题,你怎么回答?
  8. JVM - 常见的JVM种类
  9. contos7设置固定ip和dns_CentOS7 修改设置静态IP和DNS
  10. Android多媒体编程