看来这个问题getsaskedfrequently,但我没有得出任何明确的结论。我需要决定是否我应该有点帮助实现访问时,锁定代码/修改全局变量时,我有(或必须的!):在文件范围内 从单个工作线程更新全局变量:我需要互斥锁吗?
- 全局变量线程读取/从主进程线程调用访问功能并返回这些全局
写入全局变量
更具体地说,我正在编写一个C++库,它使用网络摄像头跟踪纸张上的对象 - 计算机视觉是CPU密集型的,因此性能至关重要。我有一个单个工作线程在Open()
函数中被分离出来。该线程处理所有的对象跟踪。当调用一个Close()
函数时,它被终止(间接带有全局标志)。
这感觉就像我只是要求内存损坏,但我没有观察到死锁问题,也没有遇到任何从这些访问函数返回的错误值。经过几个小时的研究,我得到的一般印象是,“呃,可能吧,无论如何,,。”如果我确实应该使用互斥体,为什么我还没有遇到任何问题呢?
这里是我目前的计划过于简单化:
// *********** lib.h ***********
// Structure definitions
struct Pointer
{
int x, y;
};
// more...
// API functions
Pointer GetPointer();
void Start();
void Stop();
// more...
实现看起来像这样...
// *********** lib.cpp ***********
// Globals
Pointer p1;
bool isRunning = false;
HANDLE hWorkerThread;
// more...
// API functions
Pointer GetPointer()
{
// NOTE: my current implementation is actually returning a pointer to the
// global object in memory, not a copy of it, like below...
// Return copy of pointer data
return p1;
}
// more "getters"...
void Open()
{
// Create worker thread -- continues until Close() is called by API user
hWorkerThread = CreateThread(NULL, 0, DoWork, NULL, 0, NULL);
}
void Close()
{
isRunning = false;
// Wait for the thread to close nicely or else you WILL get nasty
// deadlock issues on close
WaitForSingleObject(hWorkerThread, INFINITE);
}
DWORD WINAPI DoWork(LPVOID lpParam)
{
while (isRunning)
{
// do work, including updating 'p1' about 10 times per sec
}
return 0;
}
最后,该代码被从外部可执行文件调用。像这样的东西(伪代码):
// *********** main.cpp ***********
int main()
{
Open();
while (<esc not pressed>)
{
Pointer p = GetPointer();
<wait 50ms or so>
}
Close();
}
是否有我应该采取的另一种方法?这个非问题问题让我今天非常紧张: - /我需要确保这个库是稳定的并且返回准确的值。任何有识之士将不胜感激。
感谢
也许有些基础会有所帮助:http://en.wikipedia.org/wiki/Readers-writer_lock – JoshD 2010-10-21 00:07:21
感谢大家的出色答案,尤其是暗示我对读者 - 作家互斥的想法(似乎这些概念没有提供)在大学里得到很多报道......)。我最终使用boost :: shared_mutex来锁定对主程序循环中修改的每个全局变量的访问。 (请参阅http://stackoverflow.com/questions/989795/example-for-boost-shared-mutex-multiple-reads-one-write)。如果有人感兴趣,我可以提供我最终解决方案的一个简单例子。 – 2010-10-22 22:36:51