C++之多线程编程
上一篇关于C++多线程的编程使用的是Windows平台提供的一个库方法,不便于移植到其他平台上,下面使用pthread库,该库支持众多平台。
pthread头文件和库需要自己下载
下载地址这里写链接内容
进入下载网站找到相应的 .exe下载即可,各种版本均可
使用VS创建控制台程序
代码如下
#include "stdafx.h"
#include <iostream>
#include <pthread.h>
#define NUM_THEADS 5 //进程数
using namespace std;
//函数返回的是函数指针,便于后面作为参数
void * say_hello(void * args)
{
std::cout<< "hello..."<<endl;
return NULL;
}
//如果线程调用的函数在一个类中,必须将函数声明为静态函数
//因为静态成员函数属于静态全局区,线程可以共享这个区域
int _tmain(int argc, _TCHAR* argv[])
{
pthread_t tids[NUM_THEADS]; //进程 id
for (int i = 0; i < NUM_THEADS; i ++)
{
//参数:创建的线程id, 线程参数, 线程运行函数的起始地址,运行函数的参数
int ret = pthread_create(&tids[i], NULL, say_hello, NULL);
if (ret != 0)//创建线程成功返回 0
{
std::cout<<"pthread_create error:error_code"<<endl;
}
}
//等待各个线程退出后,进程才结束,否则进程强制结束,线程处于未终止的状态
pthread_exit(NULL);
return 0;
}
运行如下
再次运行如下
发现两次运行结果不一样
注意:这两种结果都正确,因为输出方法是这样写的std::cout<< "hello..."<<endl;
因为多线程的程序是并发运行的,多个线程公用一个资源,当多个线程并发执行时,不能确定资源被正确的执行,比如std::cout<< "hello..."<<endl;当上一个进程执行完输出 "hello..." 后,还没有执行
<<endl; 换行操作时,下一个线程得到了线程资源,立即执行了输出 "hello...",结果导致上一个换行没有在正确的位置输出,而在后续的执行中未被执行的 <<endl; 得到了资源,就会单独输出一个换行
上面的方法也可以创建在一个类中,使用方法稍微改变
class hhh
{
public:
static void * sayHello( void * args)
{
std:: cout<< "hello"<<endl;
return NULL;
}
};
//int ret2 = pthread_create(&tids[i], NULL, hhh::sayHello, NULL);
*/