多线程死锁

川长思鸟来 2022-07-15 14:28 423阅读 0赞
  1. /*
  2. 死锁:二个线程同时锁住一个变量时。
  3. 锁住一个变量之后,尽快操作完成解锁,解锁之前不要再锁住其它变量,否则会互锁(死锁)。
  4. */
  5. /* 注意死锁是因为二个函数的加锁与解锁的顺序有关...如下面的代码:
  6. 函数add1:
  7. g_mutex1.lock();
  8. (*a)++;
  9. g_mutex2.lock();
  10. (*b)++;
  11. g_mutex1.unlock();
  12. g_mutex2.unlock();
  13. 函数add2:
  14. g_mutex2.lock(); //加锁
  15. g_mutex1.lock();
  16. (*a)++;
  17. g_mutex1.unlock();
  18. (*b)++;
  19. g_mutex2.unlock();
  20. */
  21. #include<iostream>
  22. #include<thread>
  23. #include<mutex>
  24. #include<Windows.h>
  25. using namespace std;
  26. //trhead:引用类型一般用在函数,而 thread 是模板,避免类型转换,尽量使用指针。
  27. #define COUNT 100000
  28. mutex g_mutex1, g_mutex2; //互斥量
  29. void add1(int *a,int *b)
  30. {
  31. for (int i = 0; i < COUNT; i++)
  32. {
  33. /* 死锁的情况 于下面的add2函数合用。
  34. g_mutex1.lock();
  35. (*a)++;
  36. g_mutex2.lock();
  37. (*b)++;
  38. g_mutex1.unlock();
  39. g_mutex2.unlock();*/
  40. g_mutex1.lock();
  41. (*a)++; //注意这儿锁的变量顺序。
  42. g_mutex1.unlock();
  43. g_mutex2.lock();
  44. (*b)++;
  45. g_mutex2.unlock();
  46. //Sleep(3000);
  47. }
  48. }
  49. void add2(int *a, int *b)
  50. {
  51. for (int i = 0; i < COUNT; i++)
  52. {
  53. //g_mutex2.lock(); //加锁
  54. //g_mutex1.lock();
  55. //(*a)++;
  56. //g_mutex1.unlock();
  57. //(*b)++;
  58. //g_mutex2.unlock();
  59. g_mutex2.lock(); //加锁
  60. (*b)++;
  61. g_mutex2.unlock();
  62. g_mutex1.lock();
  63. (*a)++;
  64. g_mutex1.unlock();
  65. //Sleep(3000);
  66. }
  67. }
  68. void main()
  69. {
  70. int a = 0;
  71. int b = 0;
  72. thread th1(add1, &a, &b);
  73. thread th2(add2, &a, &b);
  74. th1.join();
  75. th2.join();
  76. while (1)
  77. {
  78. cout <<"a:"<< a << endl;
  79. cout <<"b:"<< b << endl;
  80. this_thread::sleep_for(chrono::seconds(3));
  81. }
  82. cin.get();
  83. }

发表评论

表情:
评论列表 (有 0 条评论,423人围观)

还没有评论,来说两句吧...

相关阅读

    相关 线(16)

    死锁是一个复杂且需要仔细管理的问题,在设计多线程和多进程系统时,开发者应当尽可能通过合理的设计来预防死锁的发生。如果死锁不可避免,那么应该有检测和解决死锁的机制。预防、避...

    相关 线

    死锁: 如果一个资源被一个线程占用,而且无法释放线程资源,导致其他线程无法访问这个字段,一直处于等待状态,这样就会形成 线程死锁。 例子: package com.

    相关 线

    / 死锁:二个线程同时锁住一个变量时。 锁住一个变量之后,尽快操作完成解锁,解锁之前不要再锁住其它变量,否则会互锁(死锁)。 /

    相关 线代码

    死锁 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了

    相关 线

    峨眉山月半轮秋,影入平羌江水流 Java线程的死锁一直都是经典的多线程问题;因为不同的线程都在等待根本不可能被释放的锁,从而导致所有的任务都不能继续执行; 示例代码:

    相关 线

    同步锁使用的弊端:当线程任务中出现了多个同步(多个锁)时,如果同步中嵌套了其他的同步。这时容易引发一种现象:程序出现无限等待,这种现象我们称为死锁。这种情况能避免就避免掉。