c++11 thread

c++11在语言层面上提供了对thread的支持,由于不同的平台提供了不同线程API,在语言层面提供了对thread的支持可以大大的减小代码移植的工作量。

  • thread的构造函数参数为函数名和可变参数,请看栗子
  • thread的默认构造函数创建一个没有执行过程的线程,该线程既不可以被join,也没有id,如果join将会产生terminated
  • 不可以被拷贝和赋值,拷贝构造函数和赋值函数都被thread声明为private函数,无法调用,你可能会说既然这样那默认构造函数还有什么用,别忘了c++11的新特性,move构造函数还可以用的呀,下面的栗子中将有展示
  • 一个thread对象在join了之后,将不能再join,joinable为false,同时get_id也为0
  • 可以用joinable函数来判断thread是否可以被join
  • detach可以和主线程分离,主线程将会失去控制权,经过实验主线程结束后detach的线程也结束,但是不会产生异常了
#include <iostream>
#include <thread>
#include <stdlib.h>

void sum(int a, int b) {
    std::cout<<a + b<<std::endl;
}

void mySleep() {
    std::this_thread::sleep_for(std::chrono::milliseconds(1000*30));
}


int main() {
    std::thread t(sum, 99, 1);
    std::cout<<"t.joinable:"<<t.joinable()<<std::endl;
    std::cout<<"t.get_id "<<t.get_id()<<std::endl;
    t.join();
    std::cout<<"after t.join"<<std::endl;
    std::cout<<"t.joinable:"<<t.joinable()<<std::endl;
    std::cout<<"t.get_id "<<t.get_id()<<std::endl;

    std::thread emptyTh;
    //std::thread t1 = emptyTh;//Error
    //std::thread t2(emptyTh);//Error
    std::cout<<"emptyTh.joinable:"<<emptyTh.joinable()<<std::endl;
    std::cout<<"emptyTh.get_id "<<emptyTh.get_id()<<std::endl;
    //emptyTh.join();//terminated

    std::thread t3(mySleep);
    t3.detach();
    return 0;
}

this_thread

std::this_thread是用在线程内部调用的,主要有以下api

  • get_id获取当前线程id
  • yield让出线程自己的cpu
  • sleep_for睡眠绝对时间
  • sleep_utile睡眠至绝对时间

下面直接粘贴官方栗子了

// this_thread::yield example
#include <iostream>       // std::cout
#include <thread>         // std::thread, std::this_thread::yield
#include <atomic>         // std::atomic

std::atomic<bool> ready (false);

void count1m(int id) {
  while (!ready) {             // wait until main() sets ready...
    std::this_thread::yield();
  }
  for (volatile int i=0; i<1000000; ++i) {}
  std::cout << id;
}

int main ()
{
  std::thread threads[10];
  std::cout << "race of 10 threads that count to 1 million:\n";
  for (int i=0; i<10; ++i) threads[i]=std::thread(count1m,i);
  ready = true;               // go!
  for (auto& th : threads) th.join();
  std::cout << '\n';

  return 0;
}

文档请看:http://www.cplusplus.com/reference/thread

<think>嗯,用户之前问过Boost有哪些header-only的库,现在接着问Boost.threadC++11线程接口的不同。这说明用户可能在项目中选择使用Boost还是C++标准库,需要对比两者的差异来做决定。 首先,我需要回忆Boost.ThreadC++11线程库的基本情况。Boost.Thread是Boost库中的一部分,而C++11引入了标准线程库,两者在功能上有相似之处,但实现和接口可能有差异。用户想知道它们的不同点,可能涉及到API设计、功能支持、兼容性等方面。 接下来,应该考虑两者的接口差异。比如,线程的创建方式、互斥量的类型、条件变量的使用、future和promise的实现等。Boost可能有自己的类名和函数参数,而C++11可能更简洁或者有不同命名。 另外,异常处理也是一个点。Boost在早期可能使用异常来传递错误,而C++11标准库可能同时支持异常和错误码,需要比较两者的错误处理机制。 还有,Boost可能提供一些C++11标准中没有的特性,比如线程中断机制,或者更丰富的锁类型,比如升级锁。这些在C++11中可能没有对应的实现,或者需要更高版本的C++标准支持。 时间相关的函数也可能不同,比如等待超时的参数,Boost可能使用相对时间,而C++11使用绝对时间点或者相对时间段,需要具体说明。 线程本地存储(TLS)的实现方式不同,Boost使用thread_specific_ptr,而C++11使用thread_local关键字,这可能会影响使用方式和性能。 还有线程管理函数,比如yield、sleep等,函数名和所在命名空间可能有差异,Boost可能在boost::this_thread命名空间下,而C++11在std::this_thread。 此外,兼容性方面,Boost可能为了兼容旧编译器而保留一些接口,而C++11标准可能更现代化,但需要编译器支持C++11或更高版本。 需要检查用户提到的Boost版本,可能在之前的回答中提到过Boost 1.58,但用户这次的问题没有说明,所以可能需要假设用户使用的是较新的Boost版本,但也要指出不同版本的可能变化。 还要注意,用户可能关心迁移代码时的注意事项,比如如何将Boost.Thread代码迁移到C++11标准线程库,或者两者的互操作性。 最后,总结两者的适用场景,比如如果项目已经使用Boost其他库,或者需要某些特有功能,可能继续用Boost.Thread;如果追求标准兼容和未来维护性,可能转向C++11线程库。</think>以下是 Boost.ThreadC++11 标准线程库接口的主要差异分析: --- ### 一、核心接口对比 | **功能** | **Boost.Thread** | **C++11 `<thread>`** | |------------------|--------------------------------------|------------------------------------| | **线程创建** | `boost::thread` 构造函数直接绑定可调用对象 | `std::thread` 构造函数直接绑定可调用对象 | | **线程分离** | `.detach()` | 相同 | | **线程加入** | `.join()` | 相同 | | **线程ID获取** | `.get_id()` | `.get_id()` | **示例代码对比:** ```cpp // Boost boost::thread t1([](){ std::cout << "Boost thread\n"; }); // C++11 std::thread t2([](){ std::cout << "C++11 thread\n"; }); ``` --- ### 二、互斥锁(Mutex)差异 | **类型** | **Boost** | **C++11** | **说明** | |-------------------|-----------------------------|---------------------------|--------------------------------------| | 普通互斥锁 | `boost::mutex` | `std::mutex` | 功能等价 | | 递归互斥锁 | `boost::recursive_mutex` | `std::recursive_mutex` | 相同 | | 定时互斥锁 | `boost::timed_mutex` | `std::timed_mutex` | 支持带超时的锁获取 | | **独占锁** | `boost::unique_lock<T>` | `std::unique_lock<T>` | 接口相同 | | **升级锁** | `boost::upgrade_lock<T>` | *无原生支持* | C++14 后通过 `shared_timed_mutex` 扩展 | --- ### 三、条件变量(Condition Variable) | **功能** | **Boost** | **C++11** | |------------------|----------------------------------------|----------------------------------| | 条件变量类 | `boost::condition_variable` | `std::condition_variable` | | 超时等待 | `.wait_for(lock, rel_time)` | 相同 | | 通知机制 | `.notify_one()`/`.notify_all()` | 相同 | **差异点:** - Boost 额外提供 `boost::condition_variable_any`(支持任意锁类型),C++11 无直接等价物。 --- ### 四、Future/Promise 模型 | **功能** | **Boost** | **C++11** | |------------------|----------------------------------------|----------------------------------| | Promise 对象 | `boost::promise<T>` | `std::promise<T>` | | Future 对象 | `boost::future<T>` | `std::future<T>` | | 共享Future | `boost::shared_future<T>` | `std::shared_future<T>` | | **异常传递** | `.set_exception(boost::exception_ptr)` | `.set_exception(std::exception_ptr)` | **关键差异:** - Boost 支持 `boost::future::then()`(链式异步),而 C++11 需依赖 `std::async` 或第三方库实现类似功能。 --- ### 五、特有功能对比 | **特性** | **Boost.Thread** | **C++11** | |-------------------------|--------------------------------------------|-------------------------------| | **线程中断机制** | 支持(通过 `thread::interrupt()`) | 不支持 | | **线程组管理** | 提供 `boost::thread_group` | 无原生支持 | | **线程属性配置** | 通过 `boost::thread::attributes` 定制栈大小 | C++11 仅支持有限属性(如亲和性) | --- ### 六、底层设计差异 1. **错误处理** - Boost:默认通过抛出 `boost::thread_resource_error` 异常报告错误 - C++11:可通过 `noexcept` 函数(如 `try_lock()`)或异常传递错误 2. **时间参数类型** - Boost:使用 `boost::chrono::duration` - C++11:使用 `std::chrono::duration` 3. **线程本地存储(TLS)** - Boost:`boost::thread_specific_ptr<T>` - C++11:`thread_local` 关键字 --- ### 七、迁移建议 - **优先使用 C++11 的情况**: 需跨平台兼容、避免外部依赖、使用 C++14/17 新增特性(如 `shared_timed_mutex`)。 - **优先使用 Boost 的情况**: 需要线程中断、线程组管理或兼容旧编译器(如 C++03 环境)。 --- 如果需要具体功能的使用对比示例,可以进一步补充说明!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值