我有一组C++函数:
funcB(){};
funcC(){};
funcA()
{
funcB();
funcC();
}
现在,我想使
funcA
原子化,即funcB
内部的funcC
和funcA
调用应原子执行。有什么办法可以做到这一点? 最佳答案
实现此目的的一种方法是使用新的(C++ 11)功能std::mutex
和std::lock_guard
。
对于每个 protected 资源,您都实例化单个全局std::mutex
;然后,每个线程根据需要通过创建std::lock_guard
锁定该互斥锁:
#include <thread>
#include <iostream>
#include <mutex>
#include <vector>
// A single mutex, shared by all threads. It is initialized
// into the "unlocked" state
std::mutex m;
void funcB() {
std::cout << "Hello ";
}
void funcC() {
std::cout << "World." << std::endl;
}
void funcA(int i) {
// The creation of lock_guard locks the mutex
// for the lifetime of the lock_guard
std::lock_guard<std::mutex> l(m);
// Now only a single thread can run this code
std::cout << i << ": ";
funcB();
funcC();
// As we exit this scope, the lock_guard is destroyed,
// the mutex is unlocked, and another thread is allowed to run
}
int main () {
std::vector<std::thread> vt;
// Create and launch a bunch of threads
for(int i =0; i < 10; i++)
vt.push_back(std::thread(funcA, i));
// Wait for all of them to complete
for(auto& t : vt)
t.join();
}
笔记:
funcA
不相关的代码可以调用funcB
或funcC
,而无需遵守funcA
设置的锁定。 funcA
的类的类成员。 关于c++ - C++中的原子运算,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9754821/