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

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

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


  1. //目的: 测试利用C++ 11特性实现计数器的方法 
  2. //操作系统:ubuntu 14.04 
  3. //publish_date: 2015-1-31 
  4. //注意所使用的编译命令: g++ -Wl,--no-as-needed -std=c++0x counter.cpp -lpthread 
  5. #include <iostream> 
  6. #include <atomic> 
  7. #include <thread> 
  8. #include <vector> 
  9.  
  10. using namespace std; 
  11.  
  12. atomic_int Counter(0); 
  13. int order[400]; 
  14.  
  15. void work(int id) 
  16.     int no; 
  17.     for(int i = 0; i < 100; i++) { 
  18.         no = Counter++; 
  19.         order[no] = id; 
  20.     } 
  21.  
  22. int main(int argc, char* argv[]) 
  23.     vector<thread> threads; 
  24.     //创建多线程访问计数器 
  25.     for (int i = 0; i != 4; ++i) 
  26.         //线程工作函数与线程标记参数 
  27.         threads.push_back(thread(work, i)); 
  28.     for (auto & th:threads) 
  29.         th.join(); 
  30.     //最终的计数值 
  31.     cout << "final :" << Counter << endl; 
  32.     //观察各线程的工作时序 
  33.     for(int i = 0; i < 400; i++) 
  34.         cout << "[" << i << "]=" << order[i] << " "; 
  35.     return 0; 

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

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

terminate called after throwing an instance of ‘std::system_error’

what(): Enable multithreading to use std::thread: Operation not permitted

已放弃 (核心已转储)

来源:51CTO

时间: 2024-09-19 09:16:49

利用 C++ 11 特性实现多线程计数器的相关文章

c++11特性与cocos2d-x 3.0之std::bind与std::function

 原文地址:http://www.cnblogs.com/slysky/p/3822640.html 作者:阳光下的蒲公英 c++11特性与cocos2d-x 3.0之std::bind与std::function 昨天同事让帮忙写一小功能,才发现cocos2d-x 3.0 和 cocos2d-x 3.0rc0 差别还是相当大的. 发现Label这一个控件,3.0就比rc0版本多了一个创建函数,更为关键的是3.0内的Label锚点是在ccp(0.5,0.5),而一直3.0rc0是ccp(0,

C++开发者都应该使用的10个C++11特性

在C++11新标准中,语言本身和标准库都增加了很多新内容,本文只涉及了一些皮毛.不过我相信这些新特性当中有一些,应该成为所有C++开发者的常规装备.你也许看到过许多类似介绍各种C++11特性的文章.下面是我总结的,C++开发者都需要学习和使用的C++11新特性.   auto 在C++11之前,auto关键字用来指定存储期.在新标准中,它的功能变为类型推断.auto现在成了一个类型的占位符,通知编译器去根据初始化代码推断所声明变量的真实类型.各种作用域内声明变量都可以用到它.例如,名空间中,程序

安卓利用socket把文件分割多线程传输

问题描述 安卓利用socket把文件分割多线程传输 怎么把一个大文件分割成多份,多线程并发传输 然后服务器端可以并发接受 然后组装成原来的文件? 解决方案 没有人解答我的问题么

Visual Studio, GCC, Clang, Intel 对 C++11 特性的支持一览表

距离我上次对C++11支持的不同编译器的比较已经有大半年了.这次我来根据这些预览版的编译器的文档来看下它们是如何堆砌起来的. GCC的下个版本是4.8,以及Clang即将到来的版本是3.3 .如果你使用Visual Studio 2012,你可以安装2012年11月更新支持C++11额外特征的体验版CTP. throwable 翻译于 2天前 0人顶 顶 翻译的不错哦! 我也对V.13.0的Intel C++编译器感到好奇,虽然它还不是预览版并且我也找不到有关它的新特性的信息.我没找到任何有关这

利用mysql事务特性实现并发安全的自增ID示例_Mysql

项目中经常会用到自增id,比如uid,最简单的方法就是用直接用数据库提供的AUTO_INCREMENT,但是如果用户量非常大,几千万,几亿然后需要分表存储的时候呢,这种方案就搞不定了,所以最好有一个全局的自增ID的生成器,不管是否分表,都能从生成器中获取到全局自增的ID. 实现方法应该有很多,不过所有的方案都需要解决一个问题,就是保证在高并发的情景下,数据获取依然正确,每次获取的ID都不会重复. 这里我分享两种利用mysql的innodb的事务特性来实现的方案,一种是实现过了的,另一种没有试验过

利用C#线程窗口调试多线程程序

  从网上的资料判断,调试多线程程序似乎就一下3种方法. 1.在日志的某个地方写日志文件. 优点:不会干扰程序的执行,特别是对网络的多线程通信. 缺点:每次都需要打开日志文件以查看进程运行的信息. 2.利用断点进行调试. 优点:直观,可以直接看到运行过程的值 缺点:在多个线程设置断点,可能让程序跳来跳去,还需要额外地分出一部分精力用来理清程序的逻辑 3.利用弹出窗口来查看进程调试的信息. 优点;直观 缺点;在调试网路通信的时候,使得通信的过程产生延时,导致通信失败. 4.利用vs2010自带的线

Apache利用mod_limitipconn模块限制客户端多线程下载

限制多线程现在需要用到一个http://www.aliyun.com/zixun/aggregation/14417.html">Apache的扩展模块mod_limitipconn,这里是作者的官方网站http://dominia.org/djao/limitipconn2.html mod_limitipconn下载地址,大家可以根据自己的使用环境选择适合的版本: source package RedHat/ CentOS 5 binary rpm source rpm README

Singleton模式(一) - 简单多线程计数器

1. 经典的设计模式中的代码 public class Singleton    {        private static Singleton instance;   // 唯一实例        protected Singleton() { }   // 封闭客户程序的直接实例化         public static Singleton Instance            {            get            {                if (ins

利用Java注解特性加载属性文件(properties)的值到Java类

在此之前我都是写个PropertyUtil类来加载配置文件,然后通过get方法,把key对应的值取出来. Spring提供一个PropertyPlaceholderConfigurer类,可以读取配置文件,然后在Spring配置文件通过${hibernate.dialect}这种方式注入到JavaBean中,有个不好的地方就是,要在代码中取的时候不是很方便. 然后在接触到Java注解特注解技术以后,感觉这个东东很好,hibernate映射,WebService都可以通过注解来完成,方便的很多,然