我有两个线程(应用程序的主线程和另一个线程)。我正在使用OpenGL绘制一些内容,并使用OpenGL键盘和鼠标回调。当我调用glutMainLoop()时,OpenGL会阻塞,因此我必须在后台进行一些计算,创建了另一个线程。现在,OpenGL回调应该向具有关键部分的另一个线程发送一些数据(例如按下的鼠标/键的x,y位置)。在关键部分运行时不应接受任何消息,但我希望在关键部分之后处理这些消息而不是丢弃这些消息。非OpenGL类看起来像这样:
void run()
{
for (;;) {
int currentTime = now();
if (now() - previousTime > WAIT_INTERVAL) {
previousTime = currentTime;
tick();
}
}
}
void tick() {
// critical section begins
processor->step()
// critical section ends
}
void receiveMessage(void *data) {
processor->changeSomeData(data);
}
因此,如果从OpenGL线程调用receiveMessage()并且processor->step()正在运行,则应该推迟对changeSomeData()的调用,因为它会破坏整个计算过程。
我想使用以下类来同步线程:
Mutex.h:
#ifndef MUTEX_H
#define MUTEX_H
#include <Windows.h>
class Mutex;
#include "Lock.h"
class Mutex
{
public:
Mutex();
~Mutex();
private:
void acquire();
void release();
CRITICAL_SECTION criticalSection;
friend class Lock;
};
#endif
Mutex.cpp:
#include "Mutex.h"
Mutex::Mutex()
{
InitializeCriticalSection(&this->criticalSection);
}
Mutex::~Mutex()
{
DeleteCriticalSection(&this->criticalSection);
}
void Mutex::acquire()
{
EnterCriticalSection(&this->criticalSection);
}
void Mutex::release()
{
LeaveCriticalSection(&this->criticalSection);
}
Lock.h:
#ifndef LOCK_H
#define LOCK_H
class Lock;
#include "Mutex.h"
class Lock
{
public:
Lock(Mutex& mutex);
~Lock();
private:
Mutex &mutex;
};
#endif
Lock.cpp
#include "Lock.h"
Lock::Lock(Mutex& mutex) : mutex(mutex)
{
this->mutex.acquire();
}
Lock::~Lock ()
{
this->mutex.release();
}
编辑:
这是整个项目:http://upload.visusnet.de/uploads/BlobbyWarriors-rev30.zip(约180 MB)。
编辑2:
这是 SVN 代码库:https://projects.fse.uni-due.de/svn/alexander-mueller-bloby-warriors/trunk/