【C++11】thread线程库

C++11thread库

主要用法如下:

void sleep_thread()
{
    cout << "enter thread:" << std::this_thread::get_id() << endl;
    std::this_thread::sleep_for(std::chrono::seconds(3));
    cout << "leave thread:" << std::this_thread::get_id() << endl;
}
        std::thread t1(sleep_thread);
        std::thread t2(sleep_thread);
        std::thread t3(sleep_thread);
        t1.join();
        t2.join();
        t3.join();

其中std::this_thread是获取到当前线程的句柄。

  • hardware_concurrency 获取当前支持的并发线程数
  • get_id 获取当前线程的id
  • join 阻塞等待线程执行完成
  • detach 允许线程独立执行

特别注意

没有两个 std::thread 对象会表示同一执行线程; std::thread 不可复制构造 (CopyConstructible) 或可复制赋值 (CopyAssignable) ,但是它可移动构造 (MoveConstructible) 且可移动赋值 (MoveAssignable) 。

互斥锁

C++11中提供了4中互斥锁

  • mutex: 独占型互斥量,不能递归使用(重复锁)
  • timed_mutex:带超时的独占型互斥量,不可递归使用
  • recursive_mutex:递归互斥量,不带超时功能
  • recursive_timed_mutex:带超时的递归互斥量

    简单的例子:

template<class MutexType>
struct Complex
{
    MutexType mutex;
    int i = 0;
    void mul(int x)
    {
        std::lock_guard<MutexType> lock(mutex);
        i *= x;
    }

    void div(int x)
    {
        std::lock_guard<MutexType> lock(mutex);
        i /= x;
    }

    void both(int x, int y)
    {
        std::lock_guard<MutexType> lock(mutex);
        mul(x);
        div(y);
    }
};

    Complex<std::mutex> c;
    c.mul(100);
    c.div(2);
    //c.both(1, 2); //std::system 异常

    Complex<std::recursive_mutex> rc;
    rc.both(10, 10);

另外lock_guard包装的互斥锁是默认作用域消失才可以释放,而unique_lock是可以手动释放。

猜你喜欢

转载自blog.csdn.net/gx864102252/article/details/80203455
今日推荐