【发布时间】:2017-09-02 08:11:54
【问题描述】:
阅读了Can mutex implementations be interchanged (independently of the thread implementation),据我了解,通过使用 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
这是运气还是设计?
【问题讨论】:
-
你想要什么作为答案?
-
是或否。我认为答案是肯定的,但我可能弄错了。如果没有,那是什么原因?
-
@Passer By 你知道答案吗?
-
我引用的问题提出了一个不同的问题,我从该帖子中给出的答案中推断出我的问题的答案。但我并不确定。我必须把头放在一个街区上,所以我只是检查一下。
-
这取决于你所说的实现的“交换”是什么意思。如果您的意思是您的代码可以从一个实现(编译器及其标准库)移植到另一个实现,那么答案是肯定的。如果您的意思是使用一个编译器编译代码并链接到与另一个编译器关联的标准库,那么答案是“否”。
标签: c++ multithreading