zoukankan      html  css  js  c++  java
  • 42.死锁

     1 #include <iostream>
     2 #include <thread>
     3 #include <mutex>
     4 using namespace std;
     5 
     6 #define COUNT 100000
     7 
     8 mutex g_mutex1, g_mutex2;//互斥量
     9 
    10 void add1(int *a, int *b)
    11 {
    12     for (int i = 0; i < COUNT; i++)
    13     {
    14         g_mutex1.lock();
    15         (*a)++;
    16         
    17 
    18         g_mutex2.lock();
    19         (*b)++;
    20         
    21         g_mutex2.unlock();
    22         g_mutex1.unlock();
    23     }
    24 }
    25 
    26 void add2(int *a, int *b)
    27 {
    28     for (int i = 0; i < COUNT; i++)
    29     {
    30         g_mutex2.lock();
    31         g_mutex1.lock();
    32         (*a)++;
    33         g_mutex1.unlock();
    34         (*b)++;
    35         g_mutex2.unlock();
    36     }
    37 }
    38 
    39 void main()
    40 {
    41     int a = 0;
    42     int b = 0;
    43     thread th1(add1, &a, &b);
    44     thread th2(add2, &a, &b);
    45 
    46     while (1)
    47     {
    48         cout << a << endl;
    49         cout << b << endl;
    50         this_thread::sleep_for(chrono::seconds(2));
    51     }
    52 }

    要想解决死锁就需要lock与unlock成对使用,不允许连续使用两个lock

     1 #include <iostream>
     2 #include <thread>
     3 #include <mutex>
     4 using namespace std;
     5 
     6 #define COUNT 100000
     7 
     8 mutex g_mutex1, g_mutex2;//互斥量
     9 
    10 void add1(int *a, int *b)
    11 {
    12     for (int i = 0; i < COUNT; i++)
    13     {
    14         g_mutex1.lock();
    15         (*a)++;
    16         g_mutex1.unlock();
    17 
    18         g_mutex2.lock();
    19         (*b)++;
    20         g_mutex2.unlock();
    21         
    22     }
    23     cout << "end" << endl;
    24 }
    25 
    26 void add2(int *a, int *b)
    27 {
    28     for (int i = 0; i < COUNT; i++)
    29     {
    30         
    31         g_mutex1.lock();
    32         (*a)++;
    33         g_mutex1.unlock();
    34         g_mutex2.lock();
    35         (*b)++;
    36         g_mutex2.unlock();
    37         
    38     }
    39     cout << "end" << endl;
    40 }
    41 
    42 void main()
    43 {
    44     int a = 0;
    45     int b = 0;
    46     thread th1(add1, &a, &b);
    47     thread th2(add2, &a, &b);
    48 
    49     while (1)
    50     {
    51         cout << a << endl;
    52         cout << b << endl;
    53         this_thread::sleep_for(chrono::seconds(1));
    54     }
    55 }
  • 相关阅读:
    ping 网关不同的原因(51cto博客搬迁)
    Linux Shell常用命令总结(51cto 博客搬迁)
    学生管理系统管理系统
    offset属性在各版本浏览器中的不同算法
    常用正则表达式
    select城市3级联动
    html5表单验证消息框
    清除浏览器默认选择效果
    排序之简单的冒泡排序
    简单的桶排序
  • 原文地址:https://www.cnblogs.com/xiaochi/p/8550370.html
Copyright © 2011-2022 走看看