四十四、Linux 线程——线程同步之死锁以及线程和信号
44.1 死锁
- 死锁:
- 两个线程试图同时占有两个资源,并按不同的次序锁定相应的共享资源
- 解决方式:
- 按相同的次序锁定相应的共享资源
- 使用函数 pthread_mutex_trylock(),它是函数 pthread_mutex_lock() 的非阻塞版本
44.2 线程和信号
44.2.1 介绍
- 进程中每个线程都有自己的信号屏蔽字和信号未决字
- 信号的处理方式是进程中所有线程共享的
- 进程中的信号是递送到单个线程的
- 定时器是进程资源,进程中所有的线程共享相同的定时器
- 子线程调用 alarm() 函数产生的 alarm 信号发送给主控线程
#include <signal.h>
int pthread_sigmask(int how, const sigset_t *restrict set, sigset_t *restrict oset);
- 函数功能:线程的信号屏蔽
- 返回值:成功返回0,出错,返回错误编号
44.2.2 例子1
子线程调用 alarm() 函数产生的 alarm 信号发送给主控线程
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <pthread.h>
#include <unistd.h> void sig_handler(int signo)
{
printf("pthread id in the sig_handler: %lx\n", pthread_self());
if(signo == SIGALRM) {
printf("timeout...\n");
}
alarm();
} void *th_fn(void *arg)
{
if(signal(SIGALRM, sig_handler) == SIG_ERR){
perror("signal sigalrm error");
} /** 在子线程中设置定时器 */
alarm(); int i;
for(i = ; i <= ; i++){
printf("(%lx) i: %d\n", pthread_self(), i);
sleep();
}
return (void *);
} int main(void)
{
int err;
pthread_t th;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if((err = pthread_create(&th, &attr, th_fn, (void *))) != ) {
perror("pthread create error");
} while(){
printf("control thread(%lx) is running\n", pthread_self());
sleep();
} printf("control thread over\n"); return ;
}
编译运行结果如下:

44.2.3 例子 2
线程信号屏蔽,线程发送信号给其他线程,达到一定条件后,另一线程终止另一个线程
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <pthread.h>
#include <unistd.h> void sig_handler(int signo)
{
printf("pthread id in the sig_handler: %lx\n", pthread_self());
if(signo == SIGALRM) {
printf("timeout...\n");
}
alarm();
} void *th_fn(void *arg)
{
if(signal(SIGALRM, sig_handler) == SIG_ERR){
perror("signal sigalrm error");
} /** 在子线程中设置定时器 */
alarm(); int i;
for(i = ; i <= ; i++){
printf("(%lx) i: %d\n", pthread_self(), i);
sleep();
}
return (void *);
} void *th_fn2(void *arg)
{
pthread_t th1 = (pthread_t)arg;
int i;
for(i = ; i <= ; i++){
if(i == ){
/** 终止线程 1 的运行 */
pthread_cancel(th1);
alarm();
}
printf("(%lx) i: %d\n", pthread_self(), i);
sleep();
}
return (void *);
} int main(void)
{
int err;
pthread_t th, th2;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if((err = pthread_create(&th, &attr, th_fn, (void *))) != ) {
perror("pthread create error");
} if((err = pthread_create(&th2, &attr, th_fn2, (void *)th)) != ) {
perror("pthread create error");
} sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGALRM);
/** 对主控线程屏蔽 SIGALRM 信号 */
pthread_sigmask(SIG_SETMASK, &set, NULL); while(){
printf("control thread(%lx) is running\n", pthread_self());
sleep();
} printf("control thread over\n"); return ;
}
编译运行:

四十四、Linux 线程——线程同步之死锁以及线程和信号的更多相关文章
- Gradle 1.12用户指南翻译——第四十四章. 分发插件
本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- “全栈2019”Java第四十四章:继承
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 孤荷凌寒自学python第四十四天Python操作 数据库之准备工作
孤荷凌寒自学python第四十四天Python操作数据库之准备工作 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天非常激动地开始接触Python的数据库操作的学习了,数据库是系统化设计 ...
- NeHe OpenGL教程 第四十四课:3D光晕
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- 网站开发进阶(四十四)input type="submit" 和"button"的区别
网站开发进阶(四十四)input type="submit" 和"button"的区别 在一个页面上画一个按钮,有四种办法: 这就是一个按钮.如果你不写ja ...
- SQL注入之Sqli-labs系列第四十一关(基于堆叠注入的盲注)和四十二关四十三关四十四关四十五关
0x1普通测试方式 (1)输入and1=1和and1=2测试,返回错误,证明存在注入 (2)union select联合查询 (3)查询表名 (4)其他 payload: ,( ,( 0x2 堆叠注入 ...
- Android项目实战(四十四):Zxing二维码切换横屏扫描
原文:Android项目实战(四十四):Zxing二维码切换横屏扫描 Demo链接 默认是竖屏扫描,但是当我们在清单文件中配置横屏显示的时候: <activity android:name=&q ...
- 进阶Java编程(3)线程的同步与死锁
线程的同步与死锁 1,同步问题引出 在多线程的处理之中,可以利用Runnable描述多个线程操作的资源,而Thread描述每一个线程对象,对于当多个线程访问统一资源的时候如果处理不当就会产生数据的错误 ...
- 菜鸡的Java笔记 - java 线程的同步与死锁 (同步 synchronization,死锁 deadlock)
线程的同步与死锁 (同步 synchronization,死锁 deadlock) 多线程的操作方法 1.线程同步的产生与解决 2.死锁的问题 ...
- 第四十四个知识点:在ECC密码学方案中,描述一些基本的防御方法
第四十四个知识点:在ECC密码学方案中,描述一些基本的防御方法 原文地址:http://bristolcrypto.blogspot.com/2015/08/52-things-number-44-d ...
随机推荐
- isinstance_issubclass
isinstance和issubclass分别是检验是不是对象是不是类的实例化,和子类是不是这个父类的子类 class A:pass class B(A):pass a = A() print(isi ...
- linux 基础(一)
最近公司涉及到自动化部署的问题,本人见识了后端使用linux命令niu的飞起,一直听说linux,今天开始研究研究linux 首先是下载: 1.要先安装虚拟机2.再安装Ubuntu虚拟机 需要下载Ub ...
- jq轮播图插件—手写
<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" ...
- HNOI2019做题笔记
代码比较长所以直接去LOJ看吧- 鱼(计算几何.向量) 比较套路的内容:枚举\(D\),对于其他所有点按照\(D\)极角排序,按照极角序枚举\(A\),这样垂直于\(AD\)的线也会以极角序旋转,可以 ...
- P1577 切绳子
P1577 切绳子 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位. 输入输出格式 输入格式: 第一行两个整数N ...
- 如何用ABP框架快速完成项目(6) - 用ABP一个人快速完成项目(2) - 使用多个成熟控件框架
正如我在<office365的开发者训练营,免费,在微软广州举办>课程里面所讲的, 站在巨人的肩膀上的其中一项就是, 尽量使用别人成熟的框架. 其中也包括了控件框架 abp和52abp ...
- SQL的一些基础查询语法
基础.限定.模糊查询 关键字都是大写. 使用 BETWEENN AND 的时候小的数字或者日期放到 AND(并且) 的面前,大的一个放到AND 后面. 数据操纵语言SQL分类(DML ...
- First ServiceStack Service
博客1:ServiceStack Web Service 创建与调用简单示列 博客2:Hbuilder+vs2017 web api开发app 官方文档:servicestack docs 1.手动下 ...
- 妙谈js回调函数的理解!
很有共鸣,之前也是一直对回调函数感觉不明不白的,自己也看了不少解释说明.后来我觉得造成很多人对回调理解困难的一个原因就是,我在开发中见到的大多数使用了回调函数的情况都是直接上来就 传一个回调函数进去 ...
- 工具(3): 转换Excel表格到MarkDown:exceltk
源码和下载: 0.1.3 mac: https://github.com/fanfeilong/exceltk/blob/master/pub/exceltk.0.1.3.pkg windows: h ...