首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用一条语句在C中启动后台线程

用一条语句在C中启动后台线程
EN

Stack Overflow用户
提问于 2012-04-17 09:02:18
回答 2查看 99关注 0票数 0

我读过很多关于Go语言的文章。我有很多不喜欢它的地方--足够了,我不想在日常生活中使用它。然而,有一点关于这门语言我真的很喜欢: goroutines。

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

代码语言:javascript
复制
#define go if (!fork()) for(;;exit(0))

这样,您就可以在函数调用前面加上go,以便

代码语言:javascript
复制
go printf("Hello, world!\n");

在不同的线程中运行,以及:

代码语言:javascript
复制
go { printf("Hello, world!\n"); foo(); bar(); baz(); }

但是,当然,fork()也有速度问题。(在我的机器上,fork()花费的时间是printf()的7倍,使用rdtsc x86指令进行基准测试,并运行几次以消除在内核之间切换或被调度出去的可能性。)

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

EN

回答 2

Stack Overflow用户

发布于 2012-04-17 09:13:34

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

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2012-04-17 09:54:17

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10183747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档