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 线程——线程同步之死锁以及线程和信号的更多相关文章

  1. Gradle 1.12用户指南翻译——第四十四章. 分发插件

    本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  2. “全栈2019”Java第四十四章:继承

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  3. 孤荷凌寒自学python第四十四天Python操作 数据库之准备工作

     孤荷凌寒自学python第四十四天Python操作数据库之准备工作 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天非常激动地开始接触Python的数据库操作的学习了,数据库是系统化设计 ...

  4. NeHe OpenGL教程 第四十四课:3D光晕

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  5. 网站开发进阶(四十四)input type="submit" 和"button"的区别

    网站开发进阶(四十四)input type="submit" 和"button"的区别   在一个页面上画一个按钮,有四种办法: 这就是一个按钮.如果你不写ja ...

  6. SQL注入之Sqli-labs系列第四十一关(基于堆叠注入的盲注)和四十二关四十三关四十四关四十五关

    0x1普通测试方式 (1)输入and1=1和and1=2测试,返回错误,证明存在注入 (2)union select联合查询 (3)查询表名 (4)其他 payload: ,( ,( 0x2 堆叠注入 ...

  7. Android项目实战(四十四):Zxing二维码切换横屏扫描

    原文:Android项目实战(四十四):Zxing二维码切换横屏扫描 Demo链接 默认是竖屏扫描,但是当我们在清单文件中配置横屏显示的时候: <activity android:name=&q ...

  8. 进阶Java编程(3)线程的同步与死锁

    线程的同步与死锁 1,同步问题引出 在多线程的处理之中,可以利用Runnable描述多个线程操作的资源,而Thread描述每一个线程对象,对于当多个线程访问统一资源的时候如果处理不当就会产生数据的错误 ...

  9. 菜鸡的Java笔记 - java 线程的同步与死锁 (同步 synchronization,死锁 deadlock)

    线程的同步与死锁 (同步 synchronization,死锁 deadlock)        多线程的操作方法            1.线程同步的产生与解决        2.死锁的问题     ...

  10. 第四十四个知识点:在ECC密码学方案中,描述一些基本的防御方法

    第四十四个知识点:在ECC密码学方案中,描述一些基本的防御方法 原文地址:http://bristolcrypto.blogspot.com/2015/08/52-things-number-44-d ...

随机推荐

  1. 日志学习系列(三)——NLog基础知识

    前边我们解释了log4net的学习,我们再介绍一下NLog 一.什么是NLog NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码.NLog是一个简单 ...

  2. KVM架构及模块简介

    1.简介 2.架构 3.KVM模块及QEMU 一.简介 KVM(Kernel Virtual Machine)基于内核的虚拟机.阿维·齐维迪(Avi Kivity)在一家名为Qumranet的初创企业 ...

  3. 【Api】easy-mock在线api

    解决 在使用easy-mock模拟post提交数据的情况中,我们有时需要对提交的数据进行简单逻辑处理.查阅文档发现可以使用"_req.body.keyname"来获取相应的值,但是 ...

  4. JSP 学习总结 03 核心组件 Servlet

    1 Servlet 简绍 Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生 ...

  5. EasyUI datagrid formatter 属性

    easyui的formatter属性可以帮助我们更加灵活的显示数据库中的数据. 比如,我有一个启用禁用字段,使用数字表示,1表示启用,2表示禁用,展示给客户的时候我当然希望是中文的形式. 只需要写这么 ...

  6. MyBatis 传List参数 nested exception is org.apache.ibatis.binding.BindingException: Parameter 'idList' not found.

    在MyBatis传入List参数时,MyBatis报错:nested exception is org.apache.ibatis.binding.BindingException: Paramete ...

  7. 【转】IT行业岗位以及发展方向

    以下转自https://blog.csdn.net/qq_23994787/article/details/79847270 职业生涯规划的意义 1.以既有的成就为基础,确立人生的方向,提供奋斗的策略 ...

  8. SpringCloud学习笔记:SpringCloud简介(1)

    1. 微服务 微服务具有的特点: ◊ 按照业务划分服务 ◊ 每个微服务都有独立的基础组件,如:数据库.缓存等,且运行在独立的进程中: ◊ 微服务之间的通讯通过HTTP协议或者消息组件,具有容错能力: ...

  9. LODOP不同打印机出现偏移问题

    方法简单描述:1.精确套打,设置以纸张边缘为基点,可避免不同可打区域不同带了的影响.2.不同客户端打印机位置差异,可通过打印维护调整,结果在客户端本地.或调整打印机初始位置(本人使用的金税盘的开票软件 ...

  10. Linux 学习 (五) 压缩与解压缩命令

    Linux达人养成计划 I 学习笔记 常用压缩格式:.zip | .gz | .bz2 | .tar.gz | .tar.bz2 .zip zip 压缩文件名 源文件:压缩文件 zip -r 压缩文件 ...