【问题标题】:Threads in C, C++, C++0x, pthread and boostC、C++、C++0x、pthread 和 boost 中的线程
【发布时间】:2009-08-19 15:34:48
【问题描述】:

关于 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() 可以获得什么?

【问题讨论】:

  • 在第二个例子中你写了 pthread_t x,t;稍后你使用 x,y;我猜是错字。

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


【解决方案1】:

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

【讨论】:

  • 一个大问题得到如此简洁的回答是很少见的。
  • 不是真的:这是相同问题的三倍,因为 boost 版本是基于 posix one 的未来标准版本 (c++0x) 的实现...
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-05-29
      • 1970-01-01
      • 2019-07-15
      • 2011-05-12
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      • 2016-03-26
      相关资源
      最近更新 更多