Кажется, что этот вопрос получает , задаваемый часто , но я не приду к какому-либо окончательному выводу.Мне нужна небольшая помощь в определении того, должен ли я (или должен!) Реализовывать код блокировки при доступе / изменении глобальных переменных, когда у меня есть:
- глобальные переменные, определенные в области видимости файла
- один «рабочий» поток для чтения / записи в глобальные переменные
- вызовы из основного потока процесса, вызывающие функции доступа, которые возвращают эти глобальные переменные
Итак, вопрос в том, должен ли я блокироватьдоступ к моим глобальным переменным с мьютексами?
В частности, я пишу библиотеку C ++, которая использует веб-камеру для отслеживания объектов на странице бумаги - компьютерное зрение сильно загружает процессор, поэтому производительность критична.У меня есть один рабочий поток, который запускается в функции 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();
}
Возможно, мне стоит использовать другой подход?Эта не проблема проблема сводит меня с ума сегодня: - / Я должен убедиться, что эта библиотека стабильна и возвращает точные значения.Любая идея будет принята с благодарностью.
Спасибо