读过,据我了解,我可以确保我的类是线程安全的对于所有线程实现,通过使用 C++ 11 互斥体。
我的理解正确吗?我期待的是要么是(可能有警告)要么不是(有原因)。
- 我的代码可能需要在目标平台上重新编译,但不需要更改我的源代码。 (@彼得)
- 换句话说,我应该能够针对特定平台进行编译并提供一个可以安全地与任何线程库一起使用的 .so ?
鉴于投票否决,我会尽量说得更准确。
是互斥锁的 C++11 实现独立的还有其他线程 API 吗? C++11 互斥体是否仅相互了解并独立于执行线程如何到达该点而实现阻塞。
C++11 互斥体是否始终可与 OpenMP 一起使用(通过重新编译)?无论团队 B 使用什么特定线程 API,团队 A 能否提供线程安全 API(使用 C++ 互斥体)供团队 B 使用?所有代码都可以重新编译。
我附上一个工作示例。
#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
这是运气还是设计?
如果将类的所有成员设为私有并且对受任何同步机制保护的数据进行所有访问(读/写)操作,则可以使类平台独立于线程安全(std::mutex
, std::atomic
,或其他来自 boost/Qt/其他的),无论使用的线程 API 是什么。
最简单的方法是使用单个std::recursive_mutex
/std::unique_lock
对类内的所有数据访问操作(getter/setter)进行配对,并将数据成员设置为私有。无论线程 API 如何,它都只能保证正常工作,但在性能方面可能不是最佳的。
大多数其他解决方案可能适合也可能不适合您的具体情况。有时根本不需要同步原语。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)