多线程死锁问题

rmaly 2014-07-04 04:41:42
两个线程A、B,入口函数是两个不同的函数funA、funB

void funA
{
for(1000次)
{
//dosomething();
//唤醒线程B
//挂起线程A
}
}


void funB
{
for(1000次)
{
//dosomething();
//唤醒线程A
//挂起线程B
}
}

一般都只是执行了两三个循环,分析是时间片用完所造成的死锁问题,唤醒跟挂起必须同时执行完,中间不能有时间片用完问题,这种问题怎么解决?
...全文
181 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2014-07-04
  • 打赏
  • 举报
回复
PS: 即使不加锁,这种互相调度的模式,也可能会死锁。 因为系统会调度两个线程,而两个线程又会互相调度,会造成线程调度混乱,从而死锁。。
lm_whales 2014-07-04
  • 打赏
  • 举报
回复
funA,funB有了双重身份 1)他是线程调度的管理者,会调度唤醒,挂起)funA,funB代表的线程。 2)他同时还是要同步的(线程)对象,需要通过锁把funA,funB,代表的线程同步。 管理者,和同步对象公用了一把锁,所以锁失效, 不能正常同步,这里出现层次缠绕了。 解决方案是,管理者独立出来,不参与同步。 管理者,只需要监控一下,被管理的线程就可以了。。 监控就是说,这个独立的管理者(线程),需要处理的是, 如果线程A,B正在运行(挂起),则调度线程A,B, 否则,如果线程已经结束运行,或者还没有创建,则不对线程进行管理调度。
mujiok2003 2014-07-04
  • 打赏
  • 举报
回复
勤奋的小游侠 2014-07-04
  • 打赏
  • 举报
回复
引用 4 楼 rmaly 的回复:
[quote=引用 3 楼 lovesmiles 的回复:] 加个锁不就好了? 加锁   //唤醒线程B    //挂起线程A 解锁 使得这二个操作变成原子操作。
只能针对多线程处理同一个函数呀,不同函数就不行了[/quote] 怎么就不行呢?你举个例子。别人用锁用得好好的,到你手上就不行?
rmaly 2014-07-04
  • 打赏
  • 举报
回复
引用 3 楼 lovesmiles 的回复:
加个锁不就好了? 加锁   //唤醒线程B    //挂起线程A 解锁 使得这二个操作变成原子操作。
只能针对多线程处理同一个函数呀,不同函数就不行了
勤奋的小游侠 2014-07-04
  • 打赏
  • 举报
回复
加个锁不就好了? 加锁   //唤醒线程B    //挂起线程A 解锁 使得这二个操作变成原子操作。
bdmh 2014-07-04
  • 打赏
  • 举报
回复
这属于线程同步,有设置信号量,临界等,找个关于线程的资料,都会有这方面的说明
赵4老师 2014-07-04
  • 打赏
  • 举报
回复
《Windows核心编程》 Synchronization Functions The following functions are used in synchronization. CancelWaitableTimer CreateEvent CreateMutex CreateSemaphore CreateWaitableTimer DeleteCriticalSection EnterCriticalSection GetOverlappedResult InitializeCriticalSection InitializeCriticalSectionAndSpinCount InterlockedCompareExchange InterlockedDecrement InterlockedExchange InterlockedExchangeAdd InterlockedIncrement LeaveCriticalSection MsgWaitForMultipleObjects MsgWaitForMultipleObjectsEx OpenEvent OpenMutex OpenSemaphore OpenWaitableTimer PulseEvent QueueUserAPC ReleaseMutex ReleaseSemaphore ResetEvent SetCriticalSectionSpinCount SetEvent SetWaitableTimer SignalObjectAndWait TimerAPCProc TryEnterCriticalSection WaitForMultipleObjects WaitForMultipleObjectsEx WaitForSingleObject WaitForSingleObjectEx
《计算机操作系统》可作为计算机硬件和软件以及计算机通信专业的本科生教材,也可作为从事计算机及通信工作的相关科技人员的参考书。 目录 第一章 操作系统引论 1.1 操作系统的目标和作用 1 1.1.1 操作系统的目标 1 1.1.2 操作系统的作用 2 1.1.3 推动操作系统发展的主要动力 4 1.2 操作系统的发展过程 5 1.2.1 无操作系统的计算机系统 5 1.2.2 单道批处理系统 6 1.2.3 多道批处理系统 7 1.2.4 分时系统 9 1.2.5 实时系统 11 1.2.6 微机操作系统的发展 12 1.3 操作系统的基本特性 14 1.3.1 并发性 14 1.3.2 共享性 15 1.3.3 虚拟技术 16 1.3.4 异步性 17 1.4 操作系统的主要功能 18 1.4.1 处理机管理功能 18 1.4.2 存储器管理功能 19 1.4.3 设备管理功能 21 1.4.4 文件管理功能 21 1.4.5 操作系统与用户之间的接口 22 1.5 OS结构设计 24 1.5.1 传统的操作系统结构 24 1.5.2 客户/服务器模式 26 1.5.3 面向对象的程序设计 27 1.5.4 微内核OS结构 29 习题 33 第二章 进 程 管 理 2.1 进程的基本概念 34 2.1.1 程序的顺序执行及其特征 34 2.1.2 前趋图 35 2.1.3 程序的并发执行及其特征 36 2.1.4 进程的特征与状态 37 2.1.5 进程控制块 41 2.2 进程控制 43 2.2.1 进程的创建 43 2.2.2 进程的终止 45 2.2.3 进程的阻塞与唤醒 46 2.2.4 进程的挂起与激活 47 2.3 进程同步 47 2.3.1 进程同步的基本概念 47 2.3.2 信号量机制 50 2.3.3 信号量的应用 53 2.3.4 管程机制 55 2.4 经典进程的同步问题 58 2.4.1 生产者—消费者问题 58 2.4.2 哲学家进餐问题 61 2.4.3 读者—写者问题 63 2.5 进程通信 65 2.5.1 进程通信的类型 65 2.5.2 消息传递通信的实现方法 66 2.5.3 消息传递系统实现中的若干问题 68 2.5.4 消息缓冲队列通信机制 69 2.6 线程 71 2.6.1 线程的基本概念 72 2.6.2 线程间的同步和通信 75 2.6.3 线程的实现方式 77 2.6.4 线程的实现 78 习题 81 第三章 处理机调度与死锁 3.1 处理机调度的层次 84 3.1.1 高级调度 84 3.1.2 低级调度 86 3.1.3 中级调度 87 3.2 调度队列模型和调度准则 88 3.2.1 调度队列模型 88 3.2.2 选择调度方式和调度算法的若干准则 90 3.3 调度算法 91 3.3.1 先来先服务和短作业(进程)优先调度算法 91 3.3.2 高优先权优先调度算法 93 3.3.3 基于时间片的轮转调度算法 95 3.4 实时调度 97 3.4.1 实现实时调度的基本条件 97 3.4.2 实时调度算法的分类 99 3.4.3 常用的几种实时调度算法 100 3.5 产生死锁的原因和必要条件 103 3.5.1 产生死锁的原因 103 3.5.2 产生死锁的必要条件 105 3.5.3 处理死锁的基本方法 105 3.6 预防死锁的方法 106 3.6.1 预防死锁 106 3.6.2 系统安全状态 107 3.6.3 利用银行家算法避免死锁 108 3.7 死锁的检测与解除 111 3.7.1 死锁的检测 111 3.7.2 死锁的解除 113 习题 114 第四章 存 储 器 管 理 4.1 存储器的层次结构 116 4.1.1 多级存储器结构 116 4.1.2 主存储器与寄存器 117 4.1.3 高速缓存和磁盘缓存 117 4.2 程序的装入和链接 118 4.2.1 程序的装入 118 4.2.2 程序的链接 120 4.3 连续分配方式 121 4.3.1 单一连续分配 121 4.3.2 固定分区分配 122 4.3.3 动态分区分配 123 4.3.4 伙伴系统 126 4.3.5 哈希算法 126 4.3.6 可重定位分区分配 127 4.3.7 对换 129 4.4 基本分页存储管理方式 130 4.4.1 页面与页表 130 4.4.2 地址变换机构 131 4.4.3 两级和多级页表 133 4.5 基本分段存储管理方

64,687

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧