pthreads简介

POSIX 1003.1-2001标准定义了编写多线程应用程序的API(应用程序编程接口),这个接口通常被称为pthreads。在常见的操作系统中,例如Unix、Linux、MacOS等都使用pthreads作为操作系统的线程。

Windows操作系统和其他平台不同,并不是与生俱来的就支持phreads,使用Win32或MFC编写过应用程序的朋友应该都知道,Windows平台可以通过系统对外提供的线程相关函数(例如CreateThread、TerminateThread等)创建多线程应用。

使用Windows API编写应用没有什么问题,但是当我们想编写跨平台应用时就显得有点困难。幸运的是phreads目前存在一套Windows平台下的移植版本,称为pthreads-win32。接下来笔者將使用Visual Studio2012作为开发工具,简单的介绍在Win32平台下如何使用这套线程库。

pthreads-win32下载

pthreads-win32官方网站:https://sourceware.org/pthreads-win32/

在官网上可以找到下载地址,或者点击下面链接下载合适的版本

ftp://sourceware.org/pub/pthreads-win32

笔者使用的是2.9.1版本,解压后可以看到Pre-built.2和pthreads.2文件夹。Pre-built.2为编译好的库文件和头文件,也是我们将要用到的,pthreads.2目录下为源代码。

pthreads-win32使用

1.使用VS2012创建控制台应用,將字符集设置为多字节字符集。

2.將Pre-built.2目录下的include和lib文件夹拷贝到解决方案根目录下。如下图所示:



3.在项目上点击右键选择属性,配置属性->VC++目录 下的包含目录添加$(SolutionDir)include库目录添加$(SolutionDir)lib\x86配置属性->链接器->输入->附加依赖项 中添加pthreadVC2.lib

4.编写测试代码如下:

#include "stdafx.h"
#include <pthread.h>
#include <iostream>
//供线程休眠函数pthread_delay_np使用
struct timespec delay = {2 ,0};
void* print_task_1(void* )
{
while(true)
{
std::cout<<"print_task_1 function is called!"<<std::endl;
pthread_delay_np(&delay);
}
}
void* print_task_2(void* )
{
while(true)
{
std::cout<<"print_task_2 function is called!"<<std::endl;
pthread_delay_np(&delay);
}
} int _tmain(int argc, _TCHAR* argv[])
{
pthread_t handle[2];
if(pthread_create(&handle[0],0,print_task_1,0))
{
std::cout<<"thread create failed!"<<std::endl;
return EXIT_FAILURE;
}
if(pthread_create(&handle[1],0,print_task_2,0))
{
std::cout<<"thread create failed!"<<std::endl;
return EXIT_FAILURE;
}
system("pause");
return 0;
}

在main函数中,我们通过pthread_create创建两个线程,线程处理函数print_task_1和print_task_2每休息2s后不断向控制台输出语句。调用system(“pause”)使主线程暂停。

编译运行可以发现两条线程正常工作,更深入用法请参考官方提供的文档。

项目源码:http://download.csdn.net/detail/rongbo_j/8599007

最新文章

  1. RDLC系列之二 子报表
  2. 点击label时click事件被触发两次的坑
  3. JS之tagNaem和nodeName
  4. hibernate--HQL语法与详细解释
  5. ios开发--高德地图SDK使用简介
  6. 简单选择排序(Simple Selection Sort)的C语言实现
  7. MVC笔记
  8. ASP.NET MVC 播放远程服务器上的MP3文件
  9. Lightning Conductor 洛谷P3515 决策单调性优化DP
  10. Mybatis源码分析
  11. element对象
  12. (转)利用WPF的ListView进行大数据量异步加载
  13. JS将&quot;\/Date(1530104033000)\/&quot; 格式化
  14. VS调试DLL代码使用”附加到进程“
  15. PL/SQL developer 出现无效的SQL语句的解决
  16. css中单位em和rem的区别
  17. 访问 IIS 元数据库失败解决问题的方法
  18. 图论:DFS序
  19. J2Cache 和普通缓存框架有何不同,它解决了什么问题?
  20. java的应用项目

热门文章

  1. man 7 glob
  2. C++虚函数与纯虚函数用法与区别
  3. 【codeforces 257D】Sum
  4. HDU 1026 Ignatius and the Princess I(BFS+记录路径)
  5. hibernate动态表名映射--仅仅有想不到,没有做不到
  6. 本地搭建MongoDB Server
  7. Java多线程理解:线程安全的集合对象
  8. java生成MD5校验码
  9. MyBatis、JDBC、Hibernate区别
  10. for循环练习-----ATM取款