【发布时间】:2013-10-09 21:27:20
【问题描述】:
我实现了一个基于boost mutex的锁宏,代码如下:
#include <boost/thread.hpp>
#include <iostream>
#define LOCK(x) if(Lock _lock_=x){}else
class Mutex{
public:
friend class Lock;
private:
boost::mutex mutex_;
void Lock(){
mutex_.lock();
};
void Unlock(){
mutex_.unlock();
};
};
class Lock{
public:
Lock(Mutex& mutex):mutex_(mutex){mutex_.Lock();};
~Lock(){mutex_.Unlock();};
operator bool() const {
return false;
}
private:
Mutex& mutex_;
};
void wait(int seconds)
{
boost::this_thread::sleep(boost::posix_time::seconds(seconds));
}
Mutex mtx;
void thread()
{
for (int i = 0; i < 5; ++i)
{
LOCK(mtx){
wait(1);
std::cout << "Thread " << boost::this_thread::get_id() << ": " << i << std::endl;
}
}
}
int main()
{
boost::thread t1(thread);
boost::thread t2(thread);
t1.join();
t2.join();
}
我在 Mac OS 中使用 clang++ -std=c++11 -stdlib=libc++ lock_raii.cc -lboost_system -lboost_thread 编译了它。当我运行它时,有一个Segmentation fault: 11。
它有什么问题?
【问题讨论】:
-
你试过调试了吗?
-
请不要使用那个宏。太丑了。
-
C++11 提供标准的互斥锁和锁定结构;见lock_guard。你的宏观技巧很聪明,但不是很好的做法。它增加了另一层间接和认知摩擦,几乎没有任何收获。
-
你有什么理由不使用 C++11 或 boost 中的 lock_guard 吗?我发现这个宏“把戏”特别讨厌......
-
既然拥有
boost::mutex,为什么还要重新发明互斥锁?当您拥有boost::scoped_lock时,为什么要重新发明一种锁类型?如果您真的想让该宏工作(恕我直言,这是一个坏主意),那么您需要使Lock类型可移动(不可复制),并且如果锁的所有权已转移到另一个,则使其无法解锁析构函数中的任何内容对象,那么您可以保证只有一个对象拥有锁,并且只有一个对象会解锁它。
标签: c++ multithreading boost locking