在多线程应用程序中调试崩溃时,我终于在此语句中找到了问题:
CSingleLock(&m_criticalSection, TRUE);
Run Code Online (Sandbox Code Playgroud)
请注意,它正在创建一个CSingleLock类的未命名对象,因此在此语句之后,临界区对象会立即解锁.这显然不是编码员想要的.此错误是由简单的输入错误引起的.我的问题是,有些我可以防止在编译时自己创建类的临时对象,即上面的代码类型应该生成编译器错误.一般来说,我认为每当一个类尝试进行某种资源获取时,就不应该允许该类的临时对象.有没有办法强制执行呢?
有一段时间,一位同事告诉我,他花了很多时间来调试竞争条件.罪魁祸首竟然是这样的:
void foo()
{
ScopedLock(this->mutex); // Oops, should have been a named object.
// Edit: added the "this->" to fix compilation issue.
// ....
}
Run Code Online (Sandbox Code Playgroud)
为了防止情况再次发生,他在定义ScopedLock类之后创建了以下宏:
#define ScopedLock(...) Error_You_should_create_a_named_object;
Run Code Online (Sandbox Code Playgroud)
这个补丁工作正常.
有没有人知道任何其他有趣的技术来防止这个问题?
考虑使用g++ -std=c++11(GCC 4.7.2)编译此函数:
boost::uuids::uuid getID()
{
static boost::uuids::random_generator generator;
return generator();
}
Run Code Online (Sandbox Code Playgroud)
getID从多个线程调用安全吗?
正如提到这里的局部静态对象定义在所述第一线是根据C ++ 11标准线程安全的。问题是,第二行boost::uuids::random_generator::operator()对同一对象的调用generator是否也是线程安全的。返回的UUID在单个线程中是否唯一?