0

我已经阅读了很多关于 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 指令进行基准测试并运行几次以消除在内核之间切换或被调度的可能性。)

所以,我的问题是,有没有更好的方法来实现这个,所以它更快?

4

2 回答 2

1

Goroutines 主要是线程的一个花哨的词,具有一些用于线程间通信等的额外功能。

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

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

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

于 2012-04-17T01:13:34.363 回答
1

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

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

于 2012-04-17T01:54:17.123 回答