【发布时间】:2010-10-20 23:57:07
【问题描述】:
似乎这个问题getsaskedfrequently,但我没有得出任何明确的结论。我需要一些帮助来确定在访问/修改全局变量时是否应该(或必须!)实现锁定代码:
- 在文件范围内定义的全局变量
- 单个“工作”线程读取/写入全局变量
- 从主进程线程调用返回这些全局变量的访问器函数
所以问题是,我应该用互斥锁锁定对全局变量的访问吗?
更具体地说,我正在编写一个 C++ 库,它使用网络摄像头跟踪纸页上的对象——计算机视觉是 CPU 密集型的,因此性能至关重要。我有一个 single 工作线程,它在 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();
}
也许我应该采取不同的方法?今天这个非问题的问题让我发疯了:-/我需要确保这个库是稳定的并返回准确的值。任何见解将不胜感激。
谢谢
【问题讨论】:
-
也许一些基础会有所帮助:en.wikipedia.org/wiki/Readers-writer_lock
-
感谢大家的出色回答,尤其是向我暗示读者-作家互斥锁的想法(似乎这些概念在大学里并没有得到太多的报道......)。我最终使用了 boost::shared_mutex 来锁定对在主程序循环中修改的每个全局变量的访问。 (见stackoverflow.com/questions/989795/…)。如果有人感兴趣,我可以提供我的最终解决方案的基本示例。
标签: c++ multithreading opencv mutex