不久,我将开始使用共享内存开发并行版本的网格细化算法.
该大学的一位教授指出,我们必须非常小心线程安全,因为编译器和stl都不是线程感知的.
我搜索了这个问题,答案取决于编译器(有些尝试有点线程感知)和平台(如果编译器使用的系统调用是否是线程安全的).
那么,在linux中,gcc 4编译器为new运算符生成线程安全的代码?
如果没有,解决这个问题的最佳方法是什么?也许锁定每个呼叫到新的运营商?
考虑以下代码,线程是否可能以不同的方式看到对象的状态,尽管它们都是由相同的指针引用的?
using namespace std;
class ProducerAndConsumer{
class DummyObject {
public:
DummyObject() {
sprintf(a, "%d", rand());
}
private:
char a[1000];
};
mutex queue_mutex_;
queue<DummyObject *> queue_;
thread *t1, *t2;
void Produce() {
while (true) {
Sleep(1);
// constructing object without any explicit synchronization
DummyObject *dummy = new DummyObject();
{
lock_guard<mutex> guard(queue_mutex_);
if (queue_.size() > 1000) {
delete dummy;
continue;
}
queue_.push(dummy);
}
}
}
void Consume() {
while (true) {
Sleep(1);
DummyObject *dummy;
{
lock_guard<mutex> guard(queue_mutex_);
if (queue_.empty())
continue;
dummy = …Run Code Online (Sandbox Code Playgroud)