如何检测线程是否因为互斥量而被阻塞
How to detect if a thread is blocked because of mutex
#include <iostream>
#include <thread>
#include <chrono>
#include <mutex>
std::mutex mtx;
int i = 0;
void func()
{
std::lock_guard<std::mutex> lock(mtx);
std::cout<<++i<<std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(8000));
}
int main() {
std::thread t1(func);
std::thread t2(func);
std::thread t3(func);
std::thread t4(func);
t1.join();
t2.join();
t3.join();
t4.join();
return 0;
}
这是我的 C++ 代码。如您所见,由于互斥量,任何时候只有一个线程有机会执行。换句话说,大多数线程都被互斥锁阻塞了。
我的问题是是否有一些工具或技术可以在不阅读源代码的情况下检测可执行文件中有多少线程被互斥锁阻塞?
如果是为了调试,使用调试器。在 Windows 上,MSVC 将 std::mutex 编译为临界区或 SRW 锁(取决于环境)。中断应用程序的执行,您将看到有多少线程在 EnterCriticalSection 或 AcquireSRWLockExclusive WinAPI 中休眠。
如果你想要那个信息是因为你想在运行时基于它做一些不同的事情,恐怕 std::mutex 不能那样做。您可能应该使用其他一些同步原语。我不知道你在做什么,但是当我写复杂的多线程东西时,我经常使用条件变量,and/or 原子运算符,即现代 Windows、std::atomic 上的互锁* C++.
#include <iostream>
#include <thread>
#include <chrono>
#include <mutex>
std::mutex mtx;
int i = 0;
void func()
{
std::lock_guard<std::mutex> lock(mtx);
std::cout<<++i<<std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(8000));
}
int main() {
std::thread t1(func);
std::thread t2(func);
std::thread t3(func);
std::thread t4(func);
t1.join();
t2.join();
t3.join();
t4.join();
return 0;
}
这是我的 C++ 代码。如您所见,由于互斥量,任何时候只有一个线程有机会执行。换句话说,大多数线程都被互斥锁阻塞了。
我的问题是是否有一些工具或技术可以在不阅读源代码的情况下检测可执行文件中有多少线程被互斥锁阻塞?
如果是为了调试,使用调试器。在 Windows 上,MSVC 将 std::mutex 编译为临界区或 SRW 锁(取决于环境)。中断应用程序的执行,您将看到有多少线程在 EnterCriticalSection 或 AcquireSRWLockExclusive WinAPI 中休眠。
如果你想要那个信息是因为你想在运行时基于它做一些不同的事情,恐怕 std::mutex 不能那样做。您可能应该使用其他一些同步原语。我不知道你在做什么,但是当我写复杂的多线程东西时,我经常使用条件变量,and/or 原子运算符,即现代 Windows、std::atomic 上的互锁* C++.