将CONDITION_VARIABLE与互斥体HANDLE一起使用
using CONDITION_VARIABLE with mutex HANDLE
我正在尝试将我的一个linux项目移植到windows。
在这个项目中,我使用pthread_cond_t,为了能够等待,它需要pthread_mutex_t
它们都隐藏在不同的类中,它们的锁定/等待都应该支持timedwait
现在,在linux中,它都是文档化的,而且很容易,但在windows上,我找不到任何文档,也没有任何与之相关的问题。
我知道有CONDITION_VARIABLE,但它们只适用于根据windows文档无法进行时间编辑的CRITICAL_SECTIONs,当然还有CONDITION-VARIABLE不适用的HANDLE互斥。
我不想使用任何boost或ace内置对象或任何东西,我正在寻找纯操作系统功能。
这里有我遗漏的东西吗?
在linux中,这一切都有文档记录,而且很容易,因为Windows中有更多的同步原语,而且命名也不同。
我找不到任何文档-我会从这篇文章开始,但要注意它只涵盖了其中的一些。这个列表涵盖了大约50%的最受欢迎的原语。
"CONDITION_VARIABLEs,但它们仅适用于CRITICAL_SECTION"-也适用于Slim读写器(SRW)锁。
若您想要更好的答案,您可能应该告诉我们您需要从项目中的同步原语中获得什么功能。
附言:如果你正在创建任何高性能和可扩展的东西,你根本不应该阻塞线程。通常,Windows上最有效的多线程策略是从不等待任何同步原语,只等待用户/IO子系统/网络/其他外部源。然而,我确实理解,这样的应用程序从一开始就应该这样设计,如果你从非Windows平台移植,这是不可能实现的。
更新:出于研究目的(即,如果您不关心性能、延迟或电能),您可以轻松地在关键部分对象上实现等待。请参阅示例代码(未经测试):
static const DWORD msSleepTime = 100; // default time to sleep waiting for the CS
bool WaitForCriticalSection( LPCRITICAL_SECTION lpCriticalSection, DWORD msTimeout )
{
if( dwTimeout == INFINITE )
{
EnterCriticalSection( lpCriticalSection );
return true;
}
while( true )
{
if( TryEnterCriticalSection( lpCriticalSection ) )
return true;
if( msTimeout <=0 )
return false;
DWORD msToSleepTime = std::min( msTimeout, msSleepTime );
Sleep( msToSleepTime );
msTimeout -= msToSleepTime;
}
}
然而,对于任何生产质量体系,这种方法都是不可接受的,应该使用不同的方法。您不能等待关键部分或SRW锁的原因很充分:您不应该等待。它们都是为轻量级用户模式线程同步而设计的。通常情况下,锁定它们的时间不应超过几毫秒。如果需要,这意味着使用关键部分只是浪费CPU资源和电能,而应该使用例如互斥原语。
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将C++中的库和头与MinGW一起使用
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么我不能将 rand() 与数组的大小一起使用?
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 将fold表达式与std::一起用于两个元组
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 将 std::allocate_shared 与多态资源分配器一起使用
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 将 exprtk 与自定义类的对象一起使用
- 将 std::set 与基于键的比较器一起使用
- 将 C++ 类与 Rcpp 一起使用,从 C 或 R 修改它
- 如何将 Eigen::Ref 与 pybind11 一起使用?
- 如何将AERT_Allocate与 std:vector 一起使用
- 将CONDITION_VARIABLE与互斥体HANDLE一起使用