c++ - c++线程创建/删除vs线程停止/恢复
问题描述
我正在编写仅使用 1 个线程(主线程除外)的应用程序。线程只存活很短的时间,比如 50 毫秒。但是,它应该每秒发生多次。并且除了激活时间之外,应该停止线程,并且应该运行主线程。
例如 50ms thead 做某事 -> 20ms main 做某事 -> 50ms thread 某事 -> 20ms main 什么也不做....
我首先认为线程恢复/停止会很好。但是,它比线程创建/销毁更好吗?比如线程创建->线程删除->线程创建->线程删除......
当我使用线程创建/销毁策略时,我使用线程构造函数和 thread.join() 来完成,并使用 1 个原子变量来知道何时完成。
当我使用线程恢复/停止策略时,我使用了 conditional_variable、mutex 和 condition_variable.wait()。
我预计线程恢复/停止策略具有更好的性能。但是,它看起来不像那样。看起来两者的性能和内存/cpu 使用率几乎相同。
解决方案
在操作系统级别创建线程通常确实需要相当多的开销。但是创建 std::thread 对象不一定相同。后一个动作可能只包括从线程池中请求一个线程,并销毁返回线程,而操作系统线程本身永远不会停止存在。
在这种情况下,您不会看到这两种方法之间有太大区别,因为(在操作系统级别)真正要做的就是将线程添加到线程调度算法并在两种情况下都将其删除(除非池用完线程,也需要在操作系统级别创建新线程)。仍然可能存在的微小差异可能小于线程必须等待 CPU 内核的时间,因为在典型的现代操作系统上,线程比内核多得多,因此您可能不会注意到任何差异一点也不。
仍然只是暂停恢复线程是可取的。您不依赖线程池来获得同样的性能,并且如果您将代码移植到某些不使用线程池(或已关闭)的操作系统,那么您仍然(有点)以这种方式维护自己的线程池...
推荐阅读
- python - Python 2.7 OpenCV matchTemplate,只获取最佳匹配
- angular - 如何在运行时设置 .scss 变量值?
- php - 无法在“php-jira-rest-client”中使用身份验证标头
- android - 将用户带到我的应用程序的评分页面会导致程序崩溃(仅在某些设备上)
- javascript - 无法使用 Nock 模拟外部 api
- java - Android Canvas DRAWTEXT POSITION CRAZY
- asp.net-mvc - AntiforgeryValidationException:提供的防伪令牌用于与当前用户不同的基于声明的用户
- html - CSS 问题:当我设置边距时,下面的 div 按钮被隐藏
- ldap - 就地修改 LDAP 对象类中的可能属性列表
- mysql - 如何在给予者价值之后获得下一个最小价值