多线程的那点儿事(之死锁)

相信有过多线程编程经验的朋友,都吃过死锁的苦。除非你不使用多线程,否则死锁的可能性会一直存在。为什么会出现死锁呢?我想原因主要有下面几个方面:
    (1)个人使用锁的经验差异
    (2)模块使用锁的差异
    (3)版本之间的差异
    (4)分支之间的差异
    (5)修改代码和重构代码带来的差异

    不管什么原因,死锁的危机都是存在的。那么,通常出现的死锁都有哪些呢?我们可以一个一个看过来,

    (1)忘记释放锁

[cpp] view plaincopy

  1. void data_process()  
  2. {  
  3.     EnterCriticalSection();  
  4.   
  5.     if(/* error happens */)  
  6.         return;  
  7.   
  8.     LeaveCriticalSection();  
  9. }  

    (2)单线程重复申请锁

[cpp] view plaincopy

  1. void sub_func()  
  2. {  
  3.     EnterCriticalSection();  
  4.     do_something();  
  5.     LeaveCriticalSection();  
  6. }  
  7.   
  8. void data_process()  
  9. {  
  10.     EnterCriticalSection();  
  11.     sub_func();  
  12.     LeaveCriticalSection();  
  13. }  

    (3)双线程多锁申请

[cpp] view plaincopy

  1. void data_process1()  
  2. {  
  3.     EnterCriticalSection(&cs1);  
  4.     EnterCriticalSection(&cs2);  
  5.     do_something1();  
  6.     LeaveCriticalSection(&cs2);  
  7.     LeaveCriticalSection(&cs1);  
  8. }  
  9.   
  10. void data_process2()  
  11. {  
  12.     EnterCriticalSection(&cs2);  
  13.     EnterCriticalSection(&cs1);  
  14.     do_something2();  
  15.     LeaveCriticalSection(&cs1);  
  16.     LeaveCriticalSection(&cs2);  
  17. }  

    (4)环形锁申请

[cpp] view plaincopy

  1. /* 
  2. *             A   -  B 
  3. *             |      | 
  4. *             C   -  D 
  5. */  

    假设有A、B、C、D四个人在一起吃饭,每个人左右各有一只筷子。所以,这其中要是有一个人想吃饭,他必须首先拿起左边的筷子,再拿起右边的筷子。现在,我们让所有的人同时开始吃饭。那么就很有可能出现这种情况。每个人都拿起了左边的筷子,或者每个人都拿起了右边的筷子,为了吃饭,他们现在都在等另外一只筷子。此时每个人都想吃饭,同时每个人都不想放弃自己已经得到的一那只筷子。所以,事实上大家都吃不了饭。

总结:
    (1)死锁的危险始终存在,但是我们应该尽量减少这种危害存在的范围
    (2)解决死锁花费的代价是异常高昂的
    (3)最好的死锁处理方法就是在编写程序的时候尽可能检测到死锁
    (4)多线程是一把双刃剑,有了效率的提高当然就有死锁的危险
    (5)某些程序的死锁是可以容忍的,大不了重启机器,但是有些程序不行

 

from:http://blog.csdn.net/feixiaoxing/article/details/7036264

时间: 2024-09-18 00:39:23

多线程的那点儿事(之死锁)的相关文章

windows-这样使用多线程关键字段会不会死锁 EnterCriticalSection

问题描述 这样使用多线程关键字段会不会死锁 EnterCriticalSection void Close () { Enter A ; // 完整代码为 EnterCriticalSection (&b); 以下都按此简写. Enter B; Leave B; Leave A; } ? void Read () { Enter A; Enter B; Leave A; Leave B; } [0]上述的代码会遇到死锁吗? 我的理解是, [1]Enter顺序一致 [2]每个Enter都正常配对L

JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制

JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是class对象 我们在上节验证了同步函数的锁是this,但是对于静态同步函数,你又知道多少呢? 我们做一个这样的小实验,我们给show方法加上static关键字去修饰 private static synchronized void show() { if (tick > 0) { try { Thread

Python多线程编程(五):死锁的形成_python

前一篇文章Python:使用threading模块实现多线程编程四[使用Lock互斥锁]我们已经开始涉及到如何使用互斥锁来保护我们的公共资源了,现在考虑下面的情况– 如果有多个公共资源,在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,这会引起什么问题? 死锁概念 所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程.

多线程的那点儿事(基础篇)

多线程编程是现代软件技术中很重要的一个环节.要弄懂多线程,这就要牵涉到多进程?当然,要了解到多进程,就要涉及到操作系统.不过大家也不要紧张,听我慢慢道来.这其中的环节其实并不复杂. (1)单CPU下的多线程 在没有出现多核CPU之前,我们的计算资源是唯一的.如果系统中有多个任务要处理的话,那么就需要按照某种规则依次调度这些任务进行处理.什么规则呢?可以是一些简单的调度方法,比如说 1)按照优先级调度 2)按照FIFO调度 3)按照时间片调度等等 当然,除了CPU资源之外,系统中还有一些其他的资源

多线程的那点儿事(之多线程调试)

 软件调试是我们软件开发过程中的重要一课.在前面,我们也讨论过程序调试,比如说这里.今天,我们还可以就软件调试多讲一些内容.比如说条件断点,数据断点,多线程断点等等. [cpp] view plaincopy #include <stdio.h>   int value = 0;      void test()   {       int total;       int index;          total = 0;       for(index = 0; index < 1

解决Java多线程并发的计数器问题

问题描述 解决Java多线程并发的计数器问题 3C public class Counter { public static int count = 0; public synchronized static void inc() { count++; } public static void main(String[] args) { //同时启动1000个线程,去进行i++计算,看看实际结果 for (int i = 0; i < 1000; i++) { new Thread(new Ru

Swing多线程编程(转)

  关键字: Swing,多线程,GUI,SwingWorker 摘要: 本文论述了怎样开发多线程的Swing程序,从而提高Swing程序的响应速度和性能.     近期,我将推出一系列研究Swing程序的文章,这也算是为了向Swing这个优秀的GUI库的设计者致敬吧! Swing这种优秀的GUI库一直不能占领桌面市场,实在令人费解,今天,我就用我的努力,为java在桌面市场的成功尽我微薄之力吧!     Swing的单线程开发机制 多线程开发,显然要比单线程开发有趣.高效.美妙得多.特别是在J

15个顶级Java多线程面试题及回答

原文链接  ,原文作者: Javin Paul ,  译者:赵峰 Java 线程面试问题 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程的问题.在投资银行业务中多线程和并发是一个非常受欢迎的话题,特别是电子交易发展方面相关的.他们会问面试者很多令人混淆的Java线程问题.面试官只是想确信面试者有足够的Java线程与并发方面的知识,因为候选人中有很多只浮于表面.用于直接面向市场交易的高容量和低延时的电子交易

C++死锁解决心得

一. 概述C++多线程开发中,容易出现死锁导致程序挂起的现象.关于死锁的信息,见百度百科http://baike.baidu.com/view/121723.htm. 解决步骤分为三步:1.检测死锁线程.2.打印线程信息.3.修改死锁程序. 二. 程序示例VS2005创建支持MFC的win32控制台程序.代码见示例代码DeadLockTest.cpp. [cpp] view plaincopy // DeadLockTest.cpp : Defines the entry point for t