什么是共享互斥的使用?

时间:2014-08-15 06:43:25

标签: c++ multithreading boost

请考虑以下示例 -

#include <boost/thread.hpp> 
#include <iostream> 
#include <vector> 
#include <cstdlib> 
#include <ctime> 

void wait(int seconds) 
{ 
  boost::this_thread::sleep(boost::posix_time::seconds(seconds)); 
} 

boost::shared_mutex mutex; 
std::vector<int> random_numbers; 

void fill() 
{ 
  std::srand(static_cast<unsigned int>(std::time(0))); 
  for (int i = 0; i < 3; ++i) 
  { 
    boost::unique_lock<boost::shared_mutex> lock(mutex); 
    random_numbers.push_back(std::rand()); 
    lock.unlock(); 
    wait(1); 
  } 
} 

void print() 
{ 
  for (int i = 0; i < 3; ++i) 
  { 
    wait(1); 
    boost::shared_lock<boost::shared_mutex> lock(mutex); 
    std::cout << random_numbers.back() << std::endl; 
  } 
} 

int sum = 0; 

void count() 
{ 
  for (int i = 0; i < 3; ++i) 
  { 
    wait(1); 
    boost::shared_lock<boost::shared_mutex> lock(mutex); 
    sum += random_numbers.back(); 
  } 
} 

int main() 
{ 
  boost::thread t1(fill); 
  boost::thread t2(print); 
  boost::thread t3(count); 
  t1.join(); 
  t2.join(); 
  t3.join(); 
  std::cout << "Summe: " << sum << std::endl; 
} 

在给定的示例中,print()count()都以只读方式访问random_numbers。虽然print()函数将最后一个random_numbers数写入标准输出流,但count()函数将其添加到变量sum。由于这两个函数都没有修改random_numbers,因此两者都可以使用boost::shared_lock类型的非排他锁同时访问它。

我的问题是:由于资源只读取为什么在计数和打印功能中首先需要共享互斥锁?我们管理没有它吗?

1 个答案:

答案 0 :(得分:0)

  

由于资源只读[...]

不,它不是:fill()方法继续写入以下内容:

random_numbers.push_back(std::rand()); // write to random_numbers

因此,共享互斥锁确实需要同步您对矢量的访问。