2013-09-09 2 views
1

Из MSDN page:Безопасен ли поток GlobalMemoryStatusEx?

«. Информация, возвращаемая функцией GlobalMemoryStatusEx летуча Там нет никакой гарантии, что две последовательных вызовов этой функции будут возвращать ту же информацию»

Это имеет смысл, однако я не могу определить, является ли это потокобезопасным или нет. Кто-нибудь знает так или иначе точно? Я пробовал Google, но не могу найти эту информацию.

+0

Что именно вы подразумеваете под «потокобезопасным» в этом контексте? Похоже, что это вызов функции ядра и блокирует поток вызывающего, пока результат не будет получен и возвращен. –

+1

Никакое состояние программы не будет повреждено при вызове этой функции из нескольких потоков. Он просто пытается предупредить вас, что информация, которую вы получаете, мгновенно устарела. Это запах кода. –

+0

Могу ли я безопасно называть его из нескольких параллельных потоков и полагаться на результаты, чтобы быть достаточно точными? Изменить: с учетом того, что результаты будут мгновенно устаревать. – KSletmoe

ответ

5

Что означает страница MSDN, так это то, что информация, возвращаемая функцией, изменяется во времени: это то, что означает «изменчивость». Например, информация, возвращаемая GetSystemTime, также является «изменчивой».

Другие различные концепции процедур «являются повторителями» и «являются потокобезопасными». Повторное участие означает, что информация, используемая процедурой, зависит от локальных переменных, а не от глобальных, которые могут быть интерпретированы как форма потокобезопасной процедуры. Однако «поточно-безопасный» означает, что процедура реализует механизмы взаимного исключения потоков при доступе к ресурсам, требуемым процедурой.

Теперь, хотя MSDN ничего не говорит о том, что функция является потокобезопасной, при условии, что она обращается к системным ресурсам, мы можем предположить, что эта функция фактически является потокобезопасной. Кроме того, функция принимает указатель на локальную структуру (в которой функция записывает информацию), поэтому она является реентерабельной. Если GlobalMemoryStatusEx вернул указатель на глобальную структуру, мы могли бы заподозрить, что функция не является потокобезопасной. В таком случае люди из MS, вероятно, заметят это. Например, см. Заключительную заметку в разделе «Примечания» по этой ссылке: http://msdn.microsoft.com/en-us/library/2c8d19sb(v=vs.90).aspx

+1

Спасибо, этот ответ, а также комментарии по моему вопросу ответил на то, что я хотел знать. – KSletmoe

Смежные вопросы