我想问一下用于多线程的最简单的 Mutex 方法。以下代码是线程安全的(quick-n-dirty)吗?
class myclass
{
bool locked;
vector<double> vals;
myclass();
void add(double val);
};
void myclass::add(double val)
{
if(!locked)
{
this->locked = 1;
this->vals.push_back(val);
this->locked = 0;
}
else
{
this->add(val);
}
}
int main()
{
myclass cls;
//start parallelism
cls.add(static_cast<double>(rand()));
}
这个有用吗?它是线程安全的吗?我只是想了解如何编写最简单的互斥量。
如果您对我的示例有任何建议,那就太好了。
谢谢。
感谢您说它不起作用。你能建议一个独立于编译器的修复吗?
最佳答案
Is it thread-safe?
当然不是。如果一个线程在检查和设置锁之间被抢占,那么第二个线程可以获取该锁;如果控制然后返回到第一个线程,那么两者都将获得它。 (当然,在现代处理器上,两个或多个内核可以同时执行相同的指令,以获得更多乐趣。)
至少,您需要一个原子测试和设置操作来实现这样的锁。 C++11库提供了这样的东西:
std::atomic_flag locked;
if (!locked.test_and_set()) {
vals.push_back(val);
locked.clear();
} else {
// I don't know exactly what to do here;
// but recursively calling add() is a very bad idea.
}
或者更好:
std::mutex mutex;
std::lock_guard<std::mutex> lock(mutex);
vals.push_back(val);
如果您有一个较旧的实现,那么您将不得不依赖任何可用的扩展/库,因为当时的语言或标准库没有任何帮助。
关于c++ - 有史以来最简单的互斥量。这个例子行得通吗?它是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14818915/