gpt4 book ai didi

c++ - 我可以使 C++11 类/对象普遍线程安全吗?

转载 作者:太空狗 更新时间:2023-10-29 21:12:52 25 4
gpt4 key购买 nike

已阅读Can mutex implementations be interchanged (independently of the thread implementation) ,据我了解,通过使用 C++ 11 互斥锁,我可以确保我的类对于所有线程实现都是线程安全的

我的理解正确吗?我希望是(可能有警告)或否(有原因)。

  • 我的代码可能需要在目标平台上重新编译,但不需要对我的源代码进行任何更改。 (@彼得)
  • 换句话说,我应该能够针对特定平台进行编译并提供一个 .so 可以安全地与任何线程库一起使用?

鉴于否决票,我会尽量做到更准确。

互斥体的 C++11 实现是否独立任何其他线程 API? C++11 互斥量是否只相互了解并独立于执行线程如何到达该点来实现阻塞。

C++11 互斥量是否始终与 OpenMP 一起工作(需要重新编译)?团队 A 能否提供线程安全的 API(使用 C++ 互斥锁)供团队 B 使用,而不管团队 B 使用的特定线程 API?所有代码都可以重新编译。

我附上了一个工作示例。

#include <iostream>
#include <omp.h>
#include <mutex>
class A {
unsigned n = 0;

public:

void inc() {
++n;
}

unsigned get() {
return n;
}
};

class B {
std::mutex mutex;
unsigned n = 0;

public:

void inc() {
mutex.lock();
++n;
mutex.unlock();

}

unsigned get() {
return n;
}
};

int main() {

A a;
B b;
#pragma omp parallel for
for (int i = 0; i < 100000; i++) {
a.inc();
b.inc();
}

std::cout << a.get() << " " << b.get() << std::endl;

}

我上次运行的输出是:

98015 100000

这是运气还是设计?

最佳答案

如果您将其所有成员设为私有(private)并且所有对受任何同步机制保护的数据的访问(读/写)操作(std::mutexstd::atomic,或其他来自 boost/Qt/whatever 的),不管正在使用的线程 API。

最简单的方法是使用单个 std::recursive_mutex/std::unique_lock 对用于类内的所有数据访问操作(getters/setters)并创建数据成员私有(private)的。无论线程 API 如何,它都可以保证工作,但在性能方面可能不是最佳的。

大多数其他解决方案可能适合或不适合您的具体情况。有时根本不需要同步原语。

关于c++ - 我可以使 C++11 类/对象普遍线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46011816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com