c++ - 有史以来最简单的互斥量。这个例子行得通吗?它是线程安全的吗?

标签 c++ multithreading parallel-processing global-variables mutex

我想问一下用于多线程的最简单的 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/

相关文章:

c++ - 是否可以在不向函数传递参数的情况下获取函数的返回类型?

c++ - 在 boost asio 中为异步操作的函数处理程序分配线程的困难

python - Python 中的多处理 : Parallelize a for loop to fill a Numpy array

parallel-processing - 将矩阵的每一行乘以随机数的最佳方法

c - pthread_create 是否启动创建的线程?

c++ - 简单的 OpenMP 并行 for 循环比串行计算慢

c++ - 需要将此 unix 汇编代码执行转换为等效的 windows

c++ - 在 LLVM 中生成函数指针

执行线程时更改C线程参数

java - 如何从一个方法中中断另一个方法?