2013-10-02 128 views
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秒即可完成

我想两个线程是独立的,也不要紧是否有上线a.foo()或不锁。但它的确如此,为什么?

回答

1

互斥意味着一次只有一个线程可以输入一段代码。因此,这意味着第一线到线24将第二个线程,直到第一个线程到达线26

换句话说,互斥确实让一个线程依赖于其他时候他们都试图获取互斥。

1

是的两个线程是独立的,但他们使用的互斥量是相同的。因此,如果该互斥锁被锁定,则线程将卡住,直到其他线程释放互斥锁。