C,C ++,C ++ 0x,pthread和boost中的线程

时间:2009-08-19 15:34:49

标签: c++ multithreading c++11 pthreads boost-thread

有关C / C ++中线程的问题......

C ++ 0x语法

#include <thread>

void dummy() {}

int main(int, char*[]) {
   std::thread x(dummy);
   std::thread y(dummy);
   ...
   return 0;
}

有多少线程?两个(x和y)或三个(x,y和main)?我可以在主电话中拨打this_thread::yield()吗?在main中调用this_thread::get_id()可以获得什么?

pthread语法

#include <pthread.h>

void dummy() {}

int main(int, char*[]) {
   pthread_t x, y;
   pthread_create(&x, NULL, &dummy, NULL);
   pthread_create(&y, NULL, &dummy, NULL);
   ...
   return 0;
}

有多少线程?两个(x和y)或三个(x,y和main)?我可以在主电话中拨打pthread_yield()吗?在main中调用pthread_self()可以获得什么?

提升语法

#include <boost/thread>

void dummy() {}

int main(int, char*[]) {
   boost::thread x(dummy);
   boost::thread y(dummy);
   ...
   return 0;
}

有多少线程?两个(x和y)或三个(x,y和main)?我可以在主电话中拨打boost::this_thread::yield()吗?在main中调用boost::this_thread::get_id()可以获得什么?

3 个答案:

答案 0 :(得分:25)

在每种情况下,您都创建了两个额外的线程,因此您有三个(x,y和main)。您将在每个线程上获得不同的ID,包括在main中的调用。

答案 1 :(得分:0)

主线程始终存在,您可以创建其他新线程。如果主线程死亡,则程序死亡或行为未定义。它也可以从很多线程开始,因为运行时可以启动(并且通常会像linux_threads“pthreads”实现那样)自己的线程。

调用yield总是可行的,因为它只是告诉os它可以将剩余的时间片给另一个线程,如果有任何一个具有相同或更高的优先级。如果你没有编写自旋锁等低级同步功能,那么就没有理由在应用程序中调用yield。

答案 2 :(得分:0)

以上三种实现都给出了相同的结果。由于std :: thread是在&#39; pthread&#39;之上实现的。所以都将创建三个线程。 Main将是您的父线程,其他将成为子线程,并且在创建每个线程时具有不同的ID,并且boost :: thread由与std :: thread相同的作者创建,但添加了一些增强功能。