#include <iostream>
#include <boost/thread/mutex.hpp>
#include <boost/thread/thread.hpp>
boost::shared_mutex mutex;
int count = 0;
void test(int j){
// boost::shared_lock<boost::shared_mutex> lock(mutex);
boost::unique_lock<boost::shared_mutex> lock(mutex);
std::cout << "test == " << j << std::endl;
}
void Counter() {
int i = count;
std::cout << "count == " << i << std::endl;
boost::shared_lock<boost::shared_mutex> lock(mutex);
test(count++);
}
int main() {
boost::thread_group threads;
for (int i = 0; i < 4; ++i) {
threads.create_thread(&Counter);
}
threads.join_all();
return 0;
}
写锁得等所有读锁释放之后,才能获得锁。可是每个子线程都持有读锁,并且不释放,所以造成死锁。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SN4kTM0YTM2UWYjNWZ2Q2NxYzX2UTMxADMxMzLcBTMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL2M3Lc9CX6MHc0RHaiojIsJye.png)
解决方案
用完锁就释放
#include <iostream>
#include <boost/thread/mutex.hpp>
#include <boost/thread/thread.hpp>
boost::shared_mutex mutex;
int count = 0;
void test(int j){
// boost::shared_lock<boost::shared_mutex> lock(mutex);
boost::unique_lock<boost::shared_mutex> lock(mutex);
std::cout << "test == " << j << std::endl;
}
void Counter() {
int i = count;
std::cout << "count == " << i << std::endl;
{
boost::shared_lock<boost::shared_mutex> lock(mutex);
}
test(count++);
}
int main() {
boost::thread_group threads;
for (int i = 0; i < 4; ++i) {
threads.create_thread(&Counter);
}
threads.join_all();
return 0;
}