gpt4 book ai didi

c++ - 在这个极端简单的线程监视器实现中有什么不安全的地方?

转载 作者:搜寻专家 更新时间:2023-10-31 02:00:21 25 4
gpt4 key购买 nike

我是线程同步方面的新手。我正在阅读许多条件变量的实现,例如 boost::threads 和 win32 的 pthread。我刚刚用 wait/notify/noifyall 实现了这个非常简单的监视器,我想它有很多隐藏的问题,我想从更有经验的人那里发现。有什么建议吗?

class ConditionVar
{

public :
ConditionVar () : semaphore ( INVALID_HANDLE_VALUE ) , total_waiters (0)
{
semaphore = ::CreateSemaphoreA ( NULL , 0 /* initial count */ , LONG_MAX /* max count */ , NULL );
}

~ConditionVar ()
{
::CloseHandle ( semaphore ) ;
}


public :
template <class P>
void Wait ( P pred )
{
while ( !pred() ) Wait();
}

public :

void Wait ( void )
{
INTERLOCKED_WRITE_RELEASE(&total_waiters,total_waiters + 1 );
::WaitForSingleObject ( semaphore , INFINITE );
}

//! it will notify one waiter
void Notify ( void )
{
if ( INTERLOCKED_READ_ACQUIRE(&total_waiters) )
{
Wake (1);
}
}

void NotifyAll (void )
{
if ( INTERLOCKED_READ_ACQUIRE(&total_waiters) )
{
std::cout << "notifying " << total_waiters ;
Wake ( total_waiters );
}
}

protected :
void Wake ( int count )
{
INTERLOCKED_WRITE_RELEASE(&total_waiters,total_waiters - count );
::ReleaseSemaphore ( semaphore , count , NULL );
}

private :
HANDLE semaphore;
long total_waiters;
};

最佳答案

我认为如果你复制你的实例会发生不好的事情,因为两个拷贝将使用相同的信号量。这不一定是坏事,但如果语义不完全清楚,可能会使人感到困惑。

您可以使用与 boost::noncopyable 类似的方法轻松解决此问题使用(或使用提升)。

关于c++ - 在这个极端简单的线程监视器实现中有什么不安全的地方?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2148548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com