C ++ 11线程的优点

时间:2018-09-11 09:04:27

标签: multithreading c++11

  

线程被添加到C ++ 11语言

那我想知道区别,优势和影响是什么?

如果此代码是c++03

#include <iostream>
#include <pthread.h>

void *call_from_thread(void *)
{
    std::cout << "Launched by thread" << std::endl;
    return NULL;
}

int main()
{
    pthread_t t;

    pthread_create(&t, NULL, call_from_thread, NULL);

    pthread_join(t, NULL);
    return 0;
}

这是c++11

#include <iostream>
#include <thread>

void call_from_thread()
{
    std::cout << "Hello, World" << std::endl;
}

int main()
{
    std::thread t1(call_from_thread);
    t1.join();
    return 0;
}

然后,我认为没有根本的优势。

另外,当说到语言的一部分时,我对此感到困惑,因为我看不到新的关键字或语法。我只是看到一个新的标准库。除此之外吗?这仅仅是pthread的表述吗?

3 个答案:

答案 0 :(得分:3)

除了具有更多的可移植性之外,C ++ 11线程还提供了其他好处:

  • 允许以一种类型安全的方式将参数(以及多个参数)传递给线程处理程序。 pthread_create传递一个void*,而如果使用std::thread,则在发生某些错误而不是运行时错误时会出现编译时错误
  • 线程处理程序可以是lambda
  • std::thread是一个对象,而不是指针,这使得管理对象的生存期更加容易,并降低了指针悬空的风险,特别是如果与std::unique_ptrstd::shared_ptr结合使用(如果指针变戏法)甚至需要。

这些都是我想到的直接好处。

关于标准库与语言规范:它们都是同一标准的一部分,因此都被视为“ C ++ 11”。请注意,std::thread不能 在C ++ 03中实现,因为move语义在C ++ 11中是新的,而std::thread实现了move。

答案 1 :(得分:2)

C ++线程库的主要优点是可移植性。与许多其他C ++标准库工具一样,与C ++线程库相比,诸如pthreads或Win32API之类的依赖于平台的库可提供对线程的更多控制。例如,在Windows Win32 API线程库上,您可以设置线程堆栈大小,而如果不使用平台相关代码,则无法使用C ++线程库进行操作。像TerminateThread这样的API函数允许开发人员终止其正在运行的线程(这是非常危险的操作)或使用函数SetThreadPriority设置线程优先级。

但是,使用C ++线程库使您的代码平台独立。这不仅与类thread有关。还有其他一些功能,例如互斥锁,条件变量,锁,已经标准化,因此每个C ++实现都应该实现它们以符合C ++标准。

因此,使用C ++线程库始终是一种折衷。您正在失去对线程的某种程度的控制,但是您的代码是可移植的。而且,如果您确实需要一些低级功能,则可以使用std::thread::native_handle来混合标准和平台相关的代码。

此链接std::thread::native_handle提供了一个很好的示例,说明如何混合类thread和pthread库。

答案 2 :(得分:0)

在2019年听起来很有趣,但std :: thread的一个小缺点(自从您问起)就是在二进制文件中添加了约130kb的代码。