【发布时间】:2011-05-12 22:44:19
【问题描述】:
我有两个线程(应用程序主线程和另一个)。我正在使用 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/
【问题讨论】:
-
我该怎么做?我尝试将 Mutex 对象添加到非 OpenGL 线程类,并在关键部分之前和 receiveMessage() 的开头添加了 Lock lock(mutex),但这些部分并不相互排斥。
-
很难理解您对问题的解释。您能否发布更多代码来准确显示您的 RAII Lock 类的实例化位置?另外,请发布另一个线程(运行 OpenGL 代码的线程)的存根,并显示您的锁插入的位置。
标签: c++ visual-studio multithreading opengl glut