首页 > 其他分享 >线程

线程

时间:2024-05-27 18:44:09浏览次数:19  
标签:共享资源 互斥 cond pthread 线程 唤醒

多线程线程并发问题


死锁

4个必要条件以及解决方案

  • 互斥:一般不会破坏互斥条件。
  • 请求保持:将申请所有共享资源当成一个原子操作。
  • 不可剥夺:当线程申请不到共享资源时,释放自己持有所有共享资源。
  • 循环等待:可以顺序申请资源来解决。

条件变量:需要用互斥锁一起使用

//1.初始化
pthread_cond_init();
pthread_cond_t cond = PTHREAD_COND_IN;

//2.等待条件成立的步骤
pthread_cond_timedwait();
pthread_cond_wait();

//3.唤醒阻塞线程
pthread_cond_signal(pthread_cond_t *cond);//至少唤醒一个
pthread_cond_broadcast(pthread_cond_t *cond);//唤醒所有等待该条件变量的线程
//4.销毁
pthread_cond_destory();
  • pthread_cond_wait()执行流程
    • 释放互斥锁,然后阻塞线程
    • 当函数返回时,一定要再次获得锁。但是条件变量不一定成立。这是由于唤醒线程两个API,signal和bradncast。

标签:共享资源,互斥,cond,pthread,线程,唤醒
From: https://www.cnblogs.com/wzy-cc/p/18216237

相关文章

  • 进程间通信(管道)、多线程理论、开设多线程的两种方式、threading介绍、线程之间共享数
    【一】进程间通信(管道)借助于消息队列,进程可以将消息放入队列中,然后由另一个进程从队列中取出。这种通信方式是非阻塞的,即发送进程不需要等待接收进程的响应即可继续执行。multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的进程间通信(IPC)有两种方式:队列......
  • Java线程组
    Java提供了一种在单个对象中组合多个线程的便捷方法。通过这种方式,通过单个方法调用暂停,恢复或中断线程组。注意:现在不推荐使用suspend(),resume()和stop()方法。Java线程组由java.lang.ThreadGroup类实现。ThreadGroup表示一组线程。线程组还可以包括其他线程组。线程......
  • Java 线程池优化
    1.Java线程池优化1.1.核心线程数1.2.任务队列1.2.1.LinkedBlockingQueue1.2.2.ArrayBlockingQueue1.2.3.SynchronousQueue1.2.4.总结1.3.最大线程数1.4.线程存活时间1.5.拒绝策略1.5.1.AbortPolicy(默认策略)1.5.2.CallerRunsPolicy1.5.3.DiscardPo......
  • Linux线程:线程的概念及定义
    目录一、线程的概念1.1什么是线程 1.2Linux中线程和进程的关系1.3页表的结构及实现二、线程的创建及使用2.1pthread_t一、线程的概念1.1什么是线程1、在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”。2、一切......
  • 线程池(C++)
    个人主页:Lei宝啊 愿所有美好如期而遇线程池实现线程类#pragmaonce#include<pthread.h>#include<iostream>#include<vector>#include<string>#include<cstdlib>#include<cstring>#include<functional>#include<unistd.h>#in......
  • 【Python并发编程指南】多线程、多进程与异步编程比较与选择
    ......
  • 进程和线程
    何为进程:进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。进程就可以视为程序的一个实例。站在操作系统的角度,进程是程......
  • linux 死锁排查以及线程信息打印
     脚本名称,gstack.sh#!/bin/shiftest$#-ne1;thenecho"Usage:`basename$0.sh`<process-id>"1>&2exit1fiiftest!-r/proc/$1;thenecho"Process$1notfound."1>&2exit1fi#GDBdoesn&#......
  • 第一部分 多线程基础
    本系列博客,主要是面向Java8的源码。本系列博客主要参考汪文君老师《Java高并发编程详解》一书转载请注明出处,多谢~。1.线程的start方法剖析/***Causesthisthreadtobeginexecution;theJavaVirtualMachine*callsthe<code>run</code>methodofthisth......
  • vb.net 利用APi 、句柄,通过GetWindowThreadProcessId 获得窗口所在进程ID和线程ID 结
    '''<summary>'''声明'''</summary>'''<paramname="hwnd"></param>'''<paramname="lpdwProcessId"></param>......