C++ 从windows到linux的spin_lock.h端口
我有以下标题:C++ 从windows到linux的spin_lock.h端口,c++,linux,windows,C++,Linux,Windows,我有以下标题: #if !defined(_SPIN_LOCK_H_INCLUDED_) #define _SPIN_LOCK_H_INCLUDED_ #include <windows.h> class spin_lock { public: spin_lock(); virtual ~spin_lock(); void lock( void ); void unlock( void ); private: CRITICAL_SECT
#if !defined(_SPIN_LOCK_H_INCLUDED_)
#define _SPIN_LOCK_H_INCLUDED_
#include <windows.h>
class spin_lock
{
public:
spin_lock();
virtual ~spin_lock();
void lock( void );
void unlock( void );
private:
CRITICAL_SECTION m_lock;
spin_lock( const spin_lock& that );
const spin_lock& operator = ( const spin_lock& that );
};
#如果!已定义(包括旋转锁定)
#定义(旋转)(锁定)(包括)_
#包括
类自旋锁
{
公众:
自旋锁();
虚拟~spin_lock();
无效锁(void);
作废解锁(作废);
私人:
临界截面m_锁;
自旋锁(const自旋锁&that);
const spin_lock&operator=(const spin_lock&that);
};
有没有可能在Linux上以最少的更改移植这个
在我发表评论后,我发现以下错误:
在../sources/utils.11.0/MyPDFLibUtils.cpp:43:0中包含的文件中:
../sources/utils.11.0/spin_lock.h:39:2:错误:“CRITICAL_SECTION”未命名类型
临界截面m_锁
在Microsoft SDK的WinBase.h部分中声明了临界_节
这就是实现:
#include <windows.h>
#include "spin_lock.h"
spin_lock::spin_lock()
{
::InitializeCriticalSection( &m_lock );
}
spin_lock::~spin_lock()
{
::DeleteCriticalSection( &m_lock );
}
void spin_lock::lock( void )
{
::EnterCriticalSection( &m_lock );
}
void spin_lock:: unlock( void )
{
::LeaveCriticalSection( &m_lock );
}
#包括
#包括“旋转锁定.h”
自旋锁::自旋锁()
{
::初始化CriticalSection(&m_lock);
}
旋转锁::~spin\u lock()
{
::DeleteCriticalSection(&m_lock);
}
void spin_lock::lock(void)
{
::输入关键部分(&m_-lock);
}
无效旋转锁定::解锁(无效)
{
::离开临界区段(&m_锁);
}
linux中没有关键部分。您可能需要在pthread中使用自旋锁,或者在c++11中使用原子布尔标志。了解如何使用它会有很大帮助。但是您应该能够直接替换互斥锁。Win32关键部分也不是自旋锁,因此类名有误导性。它们是自旋锁,具有最大自旋计数,可以回退到阻止Nt键控事件。因此,它们在功能上与Linux futex相同(但在语义上不相同,因为唤醒futex不会阻塞,而另一方面,等待键控事件不会检查值)。感谢您的帮助。