我感到困惑的C++ 11的原子操作,當增加原子變量並將其賦值給其他值時,C++ 11是原子操作嗎?
我知道原子變量自我增值是原子操作,
,但我用的是分配給其他值,只是懷疑。
代碼就像:
//....
static std::atomic<int> i; // global variable
//....
// in the thread
int id = ++i;
使用在不同的線程分配的情況下
,是id獨特的價值?
測試代碼:
#include <thread>
#include <mutex>
#include <atomic>
#include <iostream>
class A {
public:
static int idGenerator;
static std::mutex m;
A() {
// i know this operation will keep the id_ is unique
std::lock_guard<std::mutex> lock(m);
id_ = ++idGenerator;
}
void F(std::string name) {
std::cout << name << " " << id_ << std::endl;
}
private:
int id_;
};
int A::idGenerator = 0;
std::mutex A::m;
class B {
public:
static int idGenerator;
B() {
// after self increment, is the assignment atomic?
id_ = (++idGenerator);
}
void F(std::string name) {
std::cout << name << " " << id_.load() << std::endl;
}
private:
std::atomic<int> id_;
};
int B::idGenerator = 0;
void funcA() {
A a2;
a2.F("a2");
}
void funcB() {
B b2;
b2.F("b2");
}
int main() {
A a1;
B b1;
std::thread t1(&funcA);
std::thread t2(&funcB);
a1.F("a1");
b1.F("b1");
t1.join();
t2.join();
return 0;
}
有三個線程,
類使用lock_guard保持獨特。
B級只使用原子操作,並賦給變量
參見API'的std ::原子:: fetch_add'覆蓋在原子單元的兩個操作。 – 2014-09-03 04:40:31
對原子變量(或增量操作)的賦值是很原子的。對任何其他變量的賦值不保證是原子的。但是,爲了使其「線程安全」,在併發訪問的所有場景中,單獨使用原子性是不夠的。此外,在'B'類看你的代碼,看起來你想讓靜態成員變量idGenerator原子,而不是成員變量'id_'。 – CouchDeveloper 2014-09-03 05:46:59
我讀了crtmpserver代碼,並且每個連接只有一個iohandler類,iohandler的id由靜態的generateId生成。 crtmpserver是Single Process,如果我嘗試添加多線程支持,那麼id應該保持與前面一樣 – 2014-09-03 08:37:17