【linux高级程序设计】(第十二章)Linux多线程编程 2
线程同步机制
互斥锁通信机制
int pthread_mutex_init (pthread_mutex_t *__mutex, __const pthread_mutexattr_t *__mutexattr) :初始化互斥锁,成功返回0
参数1:要初始化的互斥锁
参数2:定义要初始化的互斥锁属性,NULL表默认
宏 PTHREAD_MUTEX_INITIALIZER 初始化静态分配互斥锁 ??这个语法是什么原理???
#define PTHREAD_MUTEX_INITIALIZER {{0,}}
初始化代码如下:
pthread_mutex_t mp = PTHREAD_MUTEX_INITIALIZER;
int pthread_mutex_destroy (pthread_mutex_t * __mutex) :销毁互斥锁,成功返回0
int pthread_mutex_lock (pthread_mutex_t *__mutex) :以阻塞方式申请互斥锁
int pthread_mutex_trylock (pthread_mutex_t *__mutex) :以非阻塞方式申请互斥锁
int pthread_mutex_unlock (pthread_mutex_t *__mutex) :释放互斥锁
例子:实现读写线程,读时不写,写时不读(我说不清楚下面的代码好不好,因为代码里面循环测试锁,跟我想象的不同,而且是写一句,读一句的。我觉得应该是可以任意写,读按顺序读)
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<pthread.h>
#include<semaphore.h>
#include<string.h>
void *thread_function (void *arg);
//全局互斥锁对象
pthread_mutex_t work_mutex;
#define WORK_SIZE 1024
//全局共享数据区
char work_area[WORK_SIZE];
int time_to_exit = ;
int main(int argc, char *argv[])
{
int res;
pthread_t a_thread;
void *thread_result;
//初始化互斥锁
res = pthread_mutex_init(&work_mutex, NULL);
if(res != )
{
printf("Mutex initialization failed");
exit(EXIT_FAILURE);
}
//创建新线程
res = pthread_create(&a_thread, NULL, thread_function, NULL);
if(res != )
{
printf("Thread creation failed");
exit(EXIT_FAILURE);
}
//接收输入前,给互斥锁上锁
pthread_mutex_lock(&work_mutex);
printf("Input some text. Enter 'end' to finish\n");
while(!time_to_exit)
{
fgets(work_area, WORK_SIZE, stdin);
//解锁
pthread_mutex_unlock(&work_mutex);
while()
{
//上锁
pthread_mutex_lock(&work_mutex);
if(work_area[] != '\0') //检测数据是否读出
{
pthread_mutex_unlock(&work_mutex); //如果没有输出,解锁
sleep();
}
else
{
break;
}
}
}
pthread_mutex_unlock(&work_mutex); //解锁
printf("\nWaiting for thread to finish...\n");
res = pthread_join(a_thread, &thread_result);
if(res != )
{
printf("Thread join failed");
exit(EXIT_FAILURE);
}
printf("Thread joined\n");
pthread_mutex_destroy(&work_mutex);
exit(EXIT_SUCCESS);
} void *thread_function(void *arg)
{
sleep();
//上锁,抢占资源
pthread_mutex_lock(&work_mutex);
while(strncmp("end", work_area, ) != )
{
printf("You input %d characters\n", strlen(work_area));
printf("the characters is %s", work_area);
work_area[] = '\0';
pthread_mutex_unlock(&work_mutex);
sleep();
pthread_mutex_lock(&work_mutex);
while(work_area[] == '\0')
{
pthread_mutex_unlock(&work_mutex);
sleep();
pthread_mutex_lock(&work_mutex);
}
}
time_to_exit = ;
work_area[] = '\0';
pthread_mutex_unlock(&work_mutex);
pthread_exit();
}
【linux高级程序设计】(第十二章)Linux多线程编程 2的更多相关文章
- linux高级管理第十二章--rsync
实验部分 1.安装rsync 2.配置文件 3.配置密码 4.后续 5.为了测试,创建几个文件 配置实时同步 1.调整inotify内核参数 安装inotify-tools 测试同步 编写脚本 验证 ...
- 读书笔记 - js高级程序设计 - 第十二章 DOM2和DOM3
Node类型的变化 访问元素的样式 myDiv.style.backgroundColor = "red" myDiv.style.width = "100px& ...
- 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条
http://blog.csdn.net/terryzero/article/details/3797782 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条 标签: swing编程 ...
- 鸟哥的linux私房菜——第十二章学习(Shell Scripts)
第十二章 Shell Scripts 1.0).什么是shell scripts? script 是"脚本.剧本"的意思.整句话是说, shell script 是针对 shel ...
- 读书笔记 - js高级程序设计 - 第十五章 使用Canvas绘图
读书笔记 - js高级程序设计 - 第十三章 事件 canvas 具备绘图能力的2D上下文 及文本API 很多浏览器对WebGL的3D上下文支持还不够好 有时候即使浏览器支持,操作系统如果缺缺 ...
- 鸟哥的Linux私房菜——第十二章:档案的压缩与打包
视频链接: 土豆:http://www.tudou.com/programs/view/GncwT0FJKsQ B站(推荐):http://www.bilibili.com/video/av98857 ...
- 第三十二章 Linux常规练习题(一)
一.练习题一 1.超级用户(管理员用户)提示符是____,普通用户提示符是____.2.linux关机重启的命令有哪些 ?3.bash是什么?4.bash特性, 常见的bash特性有哪些?5.网卡的配 ...
- 第十二章 Linux三剑客之老三—grep
一.Linux grep 命令用于查找文件里符合条件的字符串. Linux系统中的grep命令是一种功能强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来.grep全称是Global ...
- 【linux高级程序设计】(第九章)进程间通信-管道 1
Linux操作系统所支持的主要进程间的通信机制. 无名管道 PIPE cat test.txt| grep hello 上面这种管道,将一个命令的输出作为另一个命令的输入,而这种管道是临时的,命令执行 ...
- 第十二章Linux文件系统与日志
1.inode 包含文件的元信息(1)inode 内容:文件的字节数.拥有者的 UID.GID.文件的读写执行权限.时间戳等,但不包含文件名.文件名是储存在目录的目录项中.(2)查看文件的 inode ...
随机推荐
- 原码、反码、补码、BCD码、格雷码
二进制的最高位表示这个二进制的正负符号(0为正,1为负),其余各位数表示其数值本身称为原码. 正数的反码等于原码,负数的反码是在原码的基础上,符号位不变,其余各位取反. 正数的补码等于原码,负数的补码 ...
- 【02】webstorm配置babel转换器+截图(by魔芋)
[02]webstorm配置babel转换器+截图(by魔芋) [02]魔芋的安装过程 01,配置babel. 02,用webstorm.注意webstorm的版本号. 03,使用 ...
- angular 模块化之directive
通过使用directive使页面模块化.需要哪部分直接调用即可.原本这些操作需要后端配合,现在前端即可.将原本的html代码拆为不同的模块,然后通过directive衔接加载到主页面中.首先页面通过d ...
- 《Cracking the Coding Interview》——第1章:数组和字符串——题目4
2014-03-18 01:36 题目:给定一个字符串,将其中的空格‘ ’替换为‘%20’,你可以认为字符串尾部有足够空间来容纳新增字符.请不要额外开辟数组完成. 解法:先从前往后统计空格个数,然后从 ...
- 《数据结构》C++代码 前言
现在大二正在上<数据结构>课,课内的书上代码实现很喜欢无脑用类.变量名字很长,而且常常实现太繁琐,并且代码有些无法运行,这些对于老手无所谓,但初学者看起来却会很不舒服.因此写点自己实现这些 ...
- 【LeetCode】Swap Nodes in Pairs(两两交换链表中的节点)
这是LeetCode里的第24题. 题目要求: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 示例: 给定1->2->3->4, 你应该返回2->1->4- ...
- HDU 4760 Good Firewall ( Trie树 )
一开始看的时候就想歪了,比赛的时候一直在YY线段树区间覆盖,然后纠结节点数太多开不下怎么办啊啊啊啊…… 然后昨天吃饭的时候也在纠结这到底是个啥题,后来发现公共前缀->前缀??!!!!->这 ...
- ESLint 代码检查规范
目录 Airbnb Javascript Style Guide 引用 对象 数组 函数 箭头函数 类和构造器 模块 Iterators and Generators 变量 比较运算符 注释 空格 A ...
- Linux 内核数据结构bitmap
#include <stdio.h> #include <stdlib.h> #define MAX_PRIO 10000 #define BITS_PER_LONG 32 # ...
- 【bzoj3638】Cf172 k-Maximum Subsequence Sum 模拟费用流+线段树区间合并
题目描述 给一列数,要求支持操作: 1.修改某个数的值 2.读入l,r,k,询问在[l,r]内选不相交的不超过k个子段,最大的和是多少. 输入 The first line contains inte ...