c++ - 我应该修改什么来防止 C++ 线程死锁

标签 c++ multithreading deadlock

这是我的源代码:

#include "stdio.h"
#include <stdlib.h>
#include <string.h>
#include "thread"
#include "mutex"

int count0=0 ,count1 =0;
std::mutex main_thread;
std::unique_lock<std::mutex> lck(main_thread, std::defer_lock);

void Function00(long millisecond){

    while (true){

        lck.lock();
        count1++;
        printf("count0:%d count1:%d \n",count0,count1);
        lck.unlock();
        std::this_thread::sleep_for(std::chrono::milliseconds(millisecond));

    }
}

void Function01(){

    std::thread th(Function00, 1000);//count per 1 s

    do{
        lck.lock();
        count0++;
        lck.unlock();
        std::this_thread::sleep_for(std::chrono::milliseconds(500));//count per 0.5 s
    } while (1);

}



int main(int argc, char *argv[])
{
    Function01();


    return 0;
}

然后我使用命令来构建我的 .o 文件:

g++ -std=c++11 -pthread testa.cpp -o a.o

但是,它显示错误:

terminate called after throwing an instance of 'std::system_error'
  what():  Resource deadlock avoided
Aborted

我感到困惑,不知道如何解决它,所以我在 Microsoft VS2013 中尝试,它运行没有错误......我对此感到困惑。是linux下的问题吗?我应该修改什么来防止死锁?

最佳答案

unique_lock不能被锁定两次,如果你想在两个线程上锁定互斥锁,使其中一个线程阻塞,则需要使用两个unique_lock

void Function00(long millisecond){

    while (true){

        {
            std::unique_lock<std::mutex> lck(main_thread);
            count1++;
            printf("count0:%d count1:%d \n",count0,count1);
        }
        std::this_thread::sleep_for(std::chrono::milliseconds(millisecond));

    }
}

void Function01(){

    std::thread th(Function00, 1000);//count per 1 s

    do{
        {
            std::unique_lock<std::mutex> lck(main_thread);
            count0++;
        }
        std::this_thread::sleep_for(std::chrono::milliseconds(500));//count per 0.5 s
    } while (1);

}

关于c++ - 我应该修改什么来防止 C++ 线程死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33452361/

相关文章:

c++ - std::hash<std::string> 可以为不同的字符串返回相同的值吗?

c++ - 现代 C++ 是否允许双/嵌套可变参数模板扩展?

c++ - 当 future 离开范围时,线程会去哪里?

c# - 在将 Thread.Sleep 与 pictureBox 一起使用时,Winform 卡住

java - 单线程java程序中的死锁

c++ - 使用类模板扩展抽象基类

c++ - 从 std::function 调用签名推断模板参数

java - 为什么调用新线程在AsyncTask的doInbackground()中不起作用?

database - Neo4j 死锁

spring-boot - Spring Boot 和 H2 关闭死锁