2010-08-30 25 views
1

我有一段代码,它使用Boost线程来加速计算,但我需要调试它并希望以串行方式运行它们,而不是并行运行它们。我怎么做?如何使Boost线程串行运行,而不是并行运行?

+3

Err ..只是不要通过线程启动预期的子例程。 – 2010-08-30 21:55:46

+0

对于更一般的问题:[如何检测和调试多线程问题?](http://stackoverflow.com/questions/499634/how-to-detect-and-debug-multi-threading-problems) – 2010-08-30 22:15:46

+3

Your键盘驱动程序有一个线程竞争问题。 – 2010-08-30 22:37:46

回答

1

除非我错过了一些东西,只是使用单个线程进行调试。忘掉多线程,除非你正确地使用算法。

1

假设你的意思是“加速计算”,串联运行的线程根本无助于性能。实际上,这会花费你在线程上的开销,因为你没有对任何工作进行并行化。

如果你倾向于串行运行它们,只要确保每个人都在等待当前线程完成执行,然后再允许另一个运行呢?我可能在这里错过了一些东西。

+3

他希望串联运行的线程能够使调试更容易。因此,“但我需要调试它,并希望将它们串联起来”作为他第一句话的一部分。假设他在修复bug后需要重新启用并行线程是安全的。 – 2010-08-30 22:47:42

+0

正是我的意思。谢谢你,埃米尔。 – gt6989b 2010-09-01 12:38:26

1

您可以为每个线程创建一个信号量,然后在主线程中发出第一个信号量,并且每个线程都可以在其末尾发信号通知下一个信号量。

但是,仍然,为什么你需要这样调试你的应用程序?在所有线程运行的情况下调试应用程序非常有用,以便您可以查看是否有任何竞争情况发生,或者类似的情况。

+0

我想知道你是否可以使用一个简单的系统调用来强制它在1个线程中运行,就像下面提出的MSalters一样。 – gt6989b 2010-09-01 12:39:13

+0

那么,在这种情况下,只需设置断点即可。它会给你那种经验。 – Gianni 2010-09-01 20:25:16

1

在所有线程中放置断点。您的调试器应该有一个命令来逐步执行或启动一个线程。其余的线程将保持暂停状态,因此它们不会干扰您的单线程调试。一旦一个线程终止,您可以恢复所有线程,或者您可以在下一个线程中继续调试。

+0

我想知道你是否可以使用一个简单的系统调用来强制它在1个线程中运行,就像下面提出的MSalters一样。 – gt6989b 2010-09-01 12:40:02

0

仅为您的进程分配单个处理器内核。在Windows上,您可以使用SetProcessAffinityMask

+2

这不会确保他的线程将被序列化。 – tibur 2010-08-31 07:56:50

+0

正是我需要的。我想要获得正确的boost调用,以迫使库在一次运行1个线程的情况下(如果有的话)在Red Hat Linux上执行此操作。 – gt6989b 2010-09-01 12:40:45

+1

@ Gt6989b,尽管一次只能运行一个线程,但所有线程仍然处于活动状态,这意味着OS调度程序可能会随时选择中断某个线程,而让其他线程运行。而不是以串行或并行方式运行,您的线程将运行* interleaved *。我很难分辨这是否真的是你想要的。 – 2010-09-01 14:22:55