我最近实现线程/互斥管理器的努力最终导致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) 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,帮助我这个或我自己验证锁定顺序的正确性?
锁定给定
Lockable对象lock1,lock2,...,lockn使用死锁避免算法,以避免死锁.