8

关于 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()主吗?我从this_thread::get_id()main 中调用得到什么?

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()主吗?我从pthread_self()main 中调用得到什么?

提升语法

#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()主吗?我从boost::this_thread::get_id()main 中调用得到什么?

4

3 回答 3

25

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

于 2009-08-19T15:38:09.347 回答
0

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

调用 yield 始终是可能的,因为它只是告诉操作系统,如果有任何具有相同或更高优先级的线程,它可以将剩余的时间片交给另一个线程。如果您不编写像自旋锁这样的低级同步功能,那么就没有真正的理由在您的应用程序中调用 yield。

于 2009-08-26T12:26:45.777 回答
0

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

于 2014-06-17T09:29:40.960 回答