1

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 秒かかります

2 つのスレッドは独立しており、オンラインでロックされているかどうかは問題ではないと思いましたa.foo()。しかし、そうです、なぜですか?

4

2 に答える 2

1

ミューテックスとは、一度に 1 つのスレッドだけがコードに入ることができることを意味します。つまり、24 行目の最初のスレッドは、最初のスレッドが 26 行目に到達するまで 2 番目のスレッドをブロックします。

言い換えれば、相互にミューテックスを取得しようとすると、ミューテックスは一方のスレッドを他方に依存させます。

于 2013-10-02T04:44:01.863 に答える
1

はい、2 つのスレッドは独立していますが、使用しているミューテックスは同じです。したがって、そのミューテックスがロックされている場合、他のスレッドによってミューテックスが解放されるまで、スレッドはスタックします。

于 2013-10-02T06:59:49.130 に答える