Я запускаю следующую программу на 32-ядерном компьютере:
#include<iostream>
#include<algorithm>
#include<boost/thread.hpp>
using namespace std;
boost::thread_group g;
boost::mutex _mtx;
class A{
public:
void foo()
{
for(int ix = 0; ix < 10000000; ++ix)
vec.push_back(ix);
sort(vec.rbegin(), vec.rend());
}
private:
vector<int> vec;
};
void thread_fun()
{
A a;
_mtx.lock(); //line 24
a.foo();
_mtx.unlock(); //line 26
}
int main()
{
g.add_thread(new boost::thread(thread_fun));
g.add_thread(new boost::thread(thread_fun)); //line 32
g.join_all();
}
Я думал, что эти два потока независимы, и не имеет значения, есть ли блокировка на линии a.foo()
или нет. Но почему?
Мьютекс означает, что только один поток за раз может ввести кусок кода. Это означает, что первый поток в строке 24 будет блок вторая нить, пока первая нить не достигнет линии 26.
Другими словами, мьютекс делает один поток зависимым от другого, когда они оба пытаются получить мьютекс.
Да, два потока независимы, но мьютекс, который они используют, одинаков. Таким образом, если этот мьютекс заблокирован, то поток будет зависать, пока другой поток не освободит мьютекс.