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

Я запускаю следующую программу на 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() или нет. Но это так, почему?


person cpp    schedule 02.10.2013    source источник


Ответы (2)


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

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

person Adam    schedule 02.10.2013

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

person NotAgain says Reinstate Monica    schedule 02.10.2013