相关疑难解决方法(0)

使用std :: lock的大量CPU负载(c ++ 11)

我最近实现线程/互斥管理器的努力最终导致75%的CPU负载(4核心),而所有四个正在运行的线程都处于睡眠状态或等待互斥锁解锁.

具体的类太大了,不能完全发布在这里,但我可以把原因缩小到两个互斥锁的死锁安全获取

std::unique_lock<std::mutex> lock1( mutex1, std::defer_lock );
std::unique_lock<std::mutex> lock2( mutex2, std::defer_lock );
std::lock( lock1, lock2 );
Run Code Online (Sandbox Code Playgroud)

该类的另一部分使用std::condition_variablewith wait()notify_one()on mutex1来同时有选择地执行某些代码.

简单的改变

std::unique_lock<std::mutex> lock1( mutex1 );
std::unique_lock<std::mutex> lock2( mutex2 );
Run Code Online (Sandbox Code Playgroud)

使CPU使用率降至正常的1-2%.

我不敢相信,std::lock()功能是低效的.这可能是g ++ 4.6.3中的错误吗?

编辑:(示例)

#include <atomic>
#include <chrono>
#include <condition_variable>
#include <iostream>
#include <mutex>
#include <thread>

std::mutex mutex1, mutex2;
std::condition_variable cond_var;

bool cond = false;
std::atomic<bool>done{false};

using namespace std::chrono_literals;

void Take_Locks()
    {
    while( !done )
        {
        std::this_thread::sleep_for( 1s );

        std::unique_lock<std::mutex> lock1( mutex1, std::defer_lock …
Run Code Online (Sandbox Code Playgroud)

c++ mutex c++11 stdthread

31
推荐指数
3
解决办法
7393
查看次数

是否有设施可以锁定Rust中的多个互斥锁,同时防止死锁?

std::lock()在Rust中是否有像C++ 这样的工具来防止像这样的代码中的死锁:

type Type0 = Arc<Mutex<u8>>;
type Type1 = Arc<Mutex<u16>>;

fn foo(a: Type0, b: Type1) {
    let a_guard = a.lock().unwrap();
    let b_guard = b.lock().unwrap();
}

fn bar(a: Type0, b: Type1) {
    let b_guard = b.lock().unwrap();
    let a_guard = a.lock().unwrap();
}
Run Code Online (Sandbox Code Playgroud)

如果foo由thread-0和barthread-1 调用,则可能出现死锁.有什么东西,希望变量,因为我可以有超过2,帮助我这个或我自己验证锁定顺序的正确性?

以下文档std::lock:

锁定给定Lockable对象lock1,lock2,...,lockn使用死锁避免算法,以避免死锁.

mutex rust

14
推荐指数
2
解决办法
783
查看次数

标签 统计

mutex ×2

c++ ×1

c++11 ×1

rust ×1

stdthread ×1