C++多线程

C++多线程操作

  • C++ 11发布之前,C++并没有对多线程编程的专门支持,C++ 11通过标准库引入了对多线程的支持,需要说明的是,C++ 11标准库内部包裹了pthread库,因此,编译程序的时候需要加上-lpthread连接选项.
  • 头文件包含thread文件

1 std::thread

  • C++ 11中创建线程非常简单,使用std::thread类就可以,thread类定义于thread头文件,构造thread对象时传入一个可调用对象作为参数(如果可调用对象有参数,把参数同时传入),这样构造完成后,新的线程马上被创建,同时执行该可调用对象;
  • 用std::thread默认的构造函数构造的对象不关联任何线程;判断一个thread对象是否关联某个线程,使用joinable()接口,如果返回true,表明该对象关联着某个线程(即使该线程已经执行结束);
  • joinable的对象析构前,必须调用join()接口等待线程结束,或者调用detach()接口解除与线程的关联,否则会抛异常;
  • 正在执行的线程从关联的对象detach后会自主执行直至结束,对应的对象变成不关联任何线程的对象,joinable()将返回false;
  • std::thread没有拷贝构造函数和拷贝赋值操作符,因此不支持复制操作(但是可以move),也就是说,没有两个 std::thread对象会表示同一执行线程;
  • 容易知道,如下几种情况下,std::thread对象是不关联任何线程的(对这种对象调用join或detach接口会抛异常):
1.默认构造的thread对象
2.被移动后的thread对象
3.detach 或 join 后的thread对象
int increase(int * p ,  int times)
{
        for(int i = 0 ; i < times ; ++i)
        {
                ++*p;
        }
        return 0;
}

int main()
{
        int num = 0 ;
        std::thread thread1(increase,&num,10000);
}

2 std::mutex(互斥锁)

  • C++ 11通过mutex可以方便的对临界区域加锁,std::mutex类定义于mutex头文件,是用于保护共享数据避免从多个线程同时访问的同步原语。它提供了lock,try_lock,unlock等几个接口,功能如下:
1.调用方线程从成功调用lock()或try_lock()开始,到unlock()为止占有mutex对象
2.线程占有mutex时,所有其他线程若试图要求mutex的所有权,则将阻塞(对于 lock 的调用)或收到false返回值(对于 try_lock )
3.调用方线程在调用 lock 或 try_lock 前必须不占有mutex(不得二次加锁)
int increase(int * p ,  int times)
{
        for(int i = 0 ; i < times ; ++i)
        {
                mtx.lock();
                ++*p;
                mtx.unlock();
        }
        return 0;
}

int main()
{
        int num = 0 ;
        std::thread thread1(increase,&num,10000);
}
  • mutex对++语句的保护,使同一时刻,只可能有一个线程对num变量进行++操作
  • mutex和thread一样,不可复制(拷贝构造函数和拷贝赋值操作符都被删除),而且,mutex也不可移动
  • 操作系统提供mutex可以设置属性,C++11根据mutext的属性提供四种的互斥量
1.std::mutex,最常用,普遍的互斥量`默认属性`
2.std::recursive_mutex ,允许同一线程使用recursive_mutext多次加锁,然后使用相同次数的解锁操作解锁`mutex多次加锁会造成死锁`
3.std::timed_mutex,在mutex上增加了时间的属性。增加了两个成员函数try_lock_for(),try_lock_until(),分别接收一个时间范围,再给定的时间内如果互斥量被锁主了,线程阻塞,超过时间,返回false
4.std::recursive_timed_mutex,增加递归和时间属性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值