使用单个语句在C中启动后台线程

时间:2012-04-17 01:02:18

标签: c multithreading macros

我已经阅读了很多关于Go语言的内容。有很多我不喜欢它 - 足以让我不想在日常生活中使用它。但是,有一点关于我真正喜欢的语言:goroutines。

我正在考虑用C语言实现它的方法。到目前为止,我能在互联网上找到的最好的是

#define go if (!fork()) for(;;exit(0))

这样,您可以使用go将函数调用作为前缀,以便

go printf("Hello, world!\n");

在不同的主题中运行,以及:

go { printf("Hello, world!\n"); foo(); bar(); baz(); }

但是,当然,fork()有速度问题。 (在我的方框中,fork()的时间是printf()的7倍,使用rdtsc x86指令进行基准测试并运行几次以消除在内核之间切换或计划出来的可能性。)

所以,我的问题是,是否有更好的方法来实现这一点,以便它更快?

2 个答案:

答案 0 :(得分:1)

Goroutines主要是线程的一个奇特的词,有一些额外的线程间通信功能等。

我猜你感兴趣的部分是能够在一个单独的线程中运行一段代码。不幸的是,在C语言中没有一种简单的方法可以执行此操作 - 您必须编写一个函数来包含您想要在后台运行的代码,并使用接受该函数的宏或函数并使用必要的魔法使用pthread_create()或类似的。

除非有人想出一种聪明的方法来使用宏来动态创建一个函数?任何人吗?

请记住,除了最基本的线程应用程序外,您需要进行某种同步,这会使事情变得简单。

答案 1 :(得分:1)

看看OpenMP。它允许使用相对简单的#pragma指令为代码块和循环迭代生成线程。它已经存在了十多年,并且已经在许多编译器中可用(包括gcc)。

在线程中开始工作应该比fork()更快,但是在不管理许多线程的简单应用程序中,后台线程池初始化开销可能会掩盖性能提升。