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 }
  • 相关阅读:
    Fruit Ninja(随机数rand())
    C. A Mist of Florescence ----- Codeforces Round #487 (Div. 2)
    给力的移动 FZU
    FZU 2254 英语考试 (最小生成树)
    6486: An Ordinary Game(规律)
    HDU 1114: Piggy-Bank
    HDU 5916: Harmonic Value Description
    1072 威佐夫游戏
    1069 Nim游戏
    1066 Bash游戏
  • 原文地址:https://www.cnblogs.com/xiaochi/p/8550370.html
Copyright © 2011-2022 走看看