我有一组C++函数:

funcB(){};
funcC(){};
funcA()
{
    funcB();
    funcC();
}

现在,我想使funcA原子化,即funcB内部的funcCfuncA调用应原子执行。有什么办法可以做到这一点?

最佳答案

实现此目的的一种方法是使用新的(C++ 11)功能std::mutexstd::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不相关的代码可以调用funcBfuncC,而无需遵守funcA设置的锁定。
  • 根据程序的结构,您可能需要不同地管理互斥锁的生存期。例如,它可能想成为包含funcA的类的类成员。
  • 关于c++ - C++中的原子运算,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9754821/

    10-09 13:38