C++之多线程编程-二

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);
*/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值