c++ 如何给 "运行中" 的线程传递数据;

发布于 2022-09-03 08:30:29 字数 231 浏览 13 评论 0

1:场景是有一个线程池,我需要将任务队列中发生读写事件的fd拿出来传递到线程池
正常情况下创建线程时可以指定参数,比如这样

std::thread t(func,arg1,arg2,...)

但是我的fd是在线程已经创建好之后传入,那该怎么办?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

峩卟喜欢 2022-09-10 08:30:29

线程之间传递数据并不需要什么特殊的手段,因为线程的大部分数据都是共享的,全局变量、静态全局变量和通过指针传递的数据都是可以直接在线程之间共享的。
所以最简单的方法就是定义一个全局的队列,这样每个线程都可以访问到这个队列,主线程把fd写入队列,线程池中的线程都从这个队列中取数据就可以了。当然你也可以把队列的引用通过参数传给每一个线程。
考虑到这个C++标准库的queue不是线程安全的,你可能需要用锁来保证队列的线程安全.

奈何桥上唱咆哮 2022-09-10 08:30:29

随便传啊,比如全局变量,堆上的内存块,只要不是tls线程局部存储的都可以用来传输,但前提是必须用锁控制。
你可以选择互斥量等来做读写控制。

惯饮孤独 2022-09-10 08:30:29

线程池接收的是一个操作,不是一个值…线程池里的线程就算已经创建了也是阻塞在队列里…只需要往线程池里投递一个带有fd的操作就可以了…
如果线程池里已经有一个操作在阻塞等待fd进来,那也会存在一个条件变量去阻塞线程运行…fd准备好了通知条件变量就可以…

给妤﹃绝世温柔 2022-09-10 08:30:29

Windows下可以考虑PostThreadMessage。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文