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

分享到:

许多并行计算程序,需要确定待计算数据的编号,或者说,多线程间通过编号而耦合。此时,通过利用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的专栏
昵    称:
验证码:

相关文档:

  • C序列化或反序列化库:tpl
    tpl是一个开源的小项目,其主要是提供一个可以序列化或反序列化C语言数据的一个API函数库。tpl号称是最有效率的也是最快的,它可以...
  • Qt 编程环境 Cobras
    Cobras 是一个Qt的编程环境,本身就是用Qt开发的,提供一个集成的基于GDB的调试工具。具有快速和使用简单的特点,整个环境只需一个可...
  • C++ 工具类库:Moost
     Last.fm 的音乐信息检索团队近日开源了 moost 工具,这是该团队在产品开发过程中使用的 C++ 实用程序的集合。...
  • 面向对象的C语言开发框架:Nesty
    Nesty是跨平台的,面向对象的C语言开发框架。Nesty旨在为从事系统开发的编程人员提供一套统一的、高效的、易于使用的编程接口。...
  • 谷歌URL解析和规范化C库:google-url
    google-url 是一个用来解析URL和对URL进行标准化的C语言库。...
  • C++ 语言的 IO 包 Conexus I/O 库
    conexus 是一个通用的 C++ 语言的 IO 包,包含对 IPv4/6 的Sockets、串行通讯、核心消息队列、管道以及文件的操作封装。...
  • C++ Resources Compiler - 生成 C++ 源码文件
    C++ Resources Compiler 是一个工具,用来生成一个 C++ 源码文件,包括相应的头文件,用以嵌入任意数据文件并提供一个 Resource 类用来访问这...
  • C++11的并发框架:Async++
    Async++是一个轻量级的C++11并发框架。...
  • 底层的 C 程序库 skalibs
    skalibs 是一组用于一般用途的、底层的 C 程序库,可替换标准 C 库的一些方法,主要用于构建很小的静态二进制文件。...
  • C++加密/解密库:libsodium
    libsodium 是一个流行、易于使用的软件库。主要用于加密、解密、签名和生成密码哈希等等。这是一个可移植的、跨编译器支持、可安装...
  • VC++的数据库访问封装库 exdb
    封装了 VC 数据库 sql 语句、存储过程操作; 方便得到数据库返回值; 3.支持 Sqlserver、Oracle,后续将继续更新支持更多; 4.VC 面向接口设计;...
  • REEC - C语言正则表达式
    REEC是一个精简,高效的C语言正则表达式引擎,它使得C语言开发中支持正则表达式,目前已经进化到了1.2.0版本,可以说无论从功能上,...
  • 一致性hash的C++实现
    一致性哈希是分布式计算领域被广泛应用的一个算法。在许多分布式系统包括 Amazon Dynamo, memcached, Riak 等中都有使用。...
  • 为什么 C++ 中成员函数指针是 16 字节?
    当我们讨论指针时,通常假设它是一种可以用 void * 指针来表示的东西,在 x86_64 平台下是 8 个字节大小。...
  • 编译型编程语言 eC
    eC,是一位加拿大人Jrome历时十二年开发的一门编译型编程语言,拥有C++项目的性能和Java的跨平台性以及Python的方便性。 目前eC拥有自...
  • 免费的解压缩C++库和源码
    免费的解压缩C++库和源码...
  • 十个最值得阅读学习的C开源项目代码
    十个最值得阅读学习的C开源项目代码...
  • C/C++ 代码文档生成器:cldoc
    cldoc 是一个使用 clang 实现的 C/C++ 代码文档生成器。...
  • C++代码生成器:xsd2cc
    Xsd2cc是一个霸气的C++代码生成器,直接从指定的XML数据格式定义文件(.xsd)生成对应的C++类代码,然后将这些代码和xsd2cc库结合(自带...
  • C++中搜索、截取字符串
    C++中搜索、截取字符串...