Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从windows到linux的spin_lock.h端口_C++_Linux_Windows - Fatal编程技术网

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不会阻塞,而另一方面,等待键控事件不会检查值)。感谢您的帮助。