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. Windows Service 学习系列(二):C# windows服务:安装、卸载、启动和停止Windows Service几种方式

    一.通过InstallUtil.exe安装.卸载.启动.停止Windows Service 方法一 1.以管理员身份运行cmd 2.安装windows服务 切换cd C:\Windows\Micros ...

  2. 浅析foreach语句

    本篇是我对于foreach语句(增强for)的总结: 我的总结流程如下: 1.先整体说明增强for遍历集合与数组之间的区别. 2.通过一维数组来说明(给出反编译的源码,形成对照). 3.通过二维数组来 ...

  3. 一本通 1223:An Easy Problem

    \[传送门qwq\] [题目描述] 给定一个正整数N,求最小的.比N大的正整数M,使得M与N的二进制表示中有相同数目的1. 举个例子,假如给定的N为78,其二进制表示为1001110,包含4个1,那么 ...

  4. Golang 入门系列(九) 如何读取YAML,JSON,INI等配置文件

    实际项目中,读取相关的系统配置文件是很常见的事情.今天就来说一说,Golang 是如何读取YAML,JSON,INI等配置文件的. 1. json使用 JSON 应该比较熟悉,它是一种轻量级的数据交换 ...

  5. 使用反射动态调用ActiveX控件

    使用反射动态调用ActiveX控件 袁永福 2018-3-2 ■■■■问题描述: 目前的基于.NET平台的软件研发中仍然存在大量的对COM及ActiveX控件的调用.使用C#调用ActiveX控件时一 ...

  6. openstack基础:网络

    Neutron 功能 Neutron 为整个 OpenStack 环境提供网络支持,包括二层交换,三层路由,负载均衡,防火墙和 *** 等.Neutron 提供了一个灵活的框架,通过配置,无论是开源还 ...

  7. 解决import模块后提示无此模块的问题

    最近在工作中发现一个奇怪的问题: 明明已经装上了,但是还提示找不到该模块,没办法,我又去site-package文件下面看了: 发现Linux下自带的python2.7里面装上了该模块(我在root用 ...

  8. Mac之brew使用

    brew : 终端程序管理工具 能让你更快速的安装你想要的工具.而不用考虑大量的依赖. 安装命令 给官网的一样也可以自己去官网查看 它就类似于centos下的yum 和 Ubuntu下的apt-get ...

  9. spring boot 操作MySQL pom添加的配置

    1 在项目中的pom.xml配置文件添加依赖 <!--MySQL依赖 --> <dependency> <groupId>mysql</groupId> ...

  10. 我遇到的Spring的@Value注解失效问题

    项目使用的是SSM体系,spring的配置如下,配置没问题,因为我发现其他文件中的@Value可以使用,只有一处@Value失效了. spring-servlet.xml <?xml versi ...