независимость от мьютекса и потоков

Я запускаю следующую программу на 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();
}
  1. С комментариями в строках 24, 26 и 32 требуется 9 секунд.
  2. Только со строками 24, 26 с комментариями и 32 без комментариев, для завершения требуется также 9 секунд.
  3. Без прокомментированных строк требуется 18 секунд.

Я думал, что эти два потока независимы, и не имеет значения, есть ли блокировка на линии a.foo() или нет. Но почему?

1

Решение

Мьютекс означает, что только один поток за раз может ввести кусок кода. Это означает, что первый поток в строке 24 будет блок вторая нить, пока первая нить не достигнет линии 26.

Другими словами, мьютекс делает один поток зависимым от другого, когда они оба пытаются получить мьютекс.

1

Другие решения

Да, два потока независимы, но мьютекс, который они используют, одинаков. Таким образом, если этот мьютекс заблокирован, то поток будет зависать, пока другой поток не освободит мьютекс.

1