有关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()
可以获得什么?
答案 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相同的作者创建,但添加了一些增强功能。