利用 C++ 11 特性实现多线程计数器

jopen 10年前

许多并行计算程序,需要确定待计算数据的编号,或者说,多线程间通过编号而耦合。此时,通过利用C++ 11提供的atomic_?type类型,可实现多线程安全的计数器,从而,降低多线程间的耦合,以便于书写多线程程序。

以计数器实现为例子,演示了多线程计数器的实现技术方法,代码如下:

//目的: 测试利用C++ 11特性实现计数器的方法  //操作系统:ubuntu 14.04  //publish_date: 2015-1-31  //注意所使用的编译命令: g++ -Wl,--no-as-needed -std=c++0x counter.cpp -lpthread  #include <iostream>  #include <atomic>  #include <thread>  #include <vector>    using namespace std;    atomic_int Counter(0);  int order[400];    void work(int id)  {   int no;   for(int i = 0; i < 100; i++) {    no = Counter++;    order[no] = id;   }  }    int main(int argc, char* argv[])  {      vector<thread> threads;   //创建多线程访问计数器      for (int i = 0; i != 4; ++i)       //线程工作函数与线程标记参数          threads.push_back(thread(work, i));      for (auto & th:threads)          th.join();      //最终的计数值      cout << "final :" << Counter << endl;      //观察各线程的工作时序      for(int i = 0; i < 400; i++)    cout << "[" << i << "]=" << order[i] << " ";      return 0;  }

注意编译命令的参数,尤其,-lpthread

否则,若无该链接参数,则编译不会出错,但会发生运行时错误:

terminate called after throwing an instance of ‘std::system_error’
what():  Enable multithreading to use std::thread: Operation not permitted
已放弃 (核心已转储)

来源:alaclp的专栏