请考虑以下示例 -
#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
类型的非排他锁同时访问它。
我的问题是:由于资源只读取为什么在计数和打印功能中首先需要共享互斥锁?我们管理没有它吗?
答案 0 :(得分:0)
由于资源只读[...]
不,它不是:fill()
方法继续写入以下内容:
random_numbers.push_back(std::rand()); // write to random_numbers
因此,共享互斥锁确实需要同步您对矢量的访问。