【发布时间】:2012-07-25 05:11:23
【问题描述】:
我在 2 个线程之间共享一个变量。我使用 volatile 来避免优化。
但是,它显示了 strcpy 中没有 volatile 的错误。 (如下)
如何正确修复此错误?
有人告诉我要键入 volatile。 但是如果我抛弃了 volatile,那么我就失去了 volatile 的目的...... 最终可能会因优化而出现运行时错误.....不是吗?
非常感谢。
(代码可以直接编译)
CRITICAL_SECTION CriticalSection;
HANDLE hEvent;
void __cdecl MyThread(void* name)
{
char serName[256];
volatile char* vptr = (char*) name;
EnterCriticalSection(&CriticalSection);
strcpy(serName, vptr); // error : cannot convert 'volatile'
// use (and not modify) name…
LeaveCriticalSection(&CriticalSection);
SetEvent (hEvent) ;
}
void main ()
{
char name[256] = "abcde";
hEvent = CreateEvent (NULL, false, false, NULL) ;
if (!InitializeCriticalSectionAndSpinCount(&CriticalSection, 0x80000400) )
return;
_beginthread (MyThread, 0, name) ;
EnterCriticalSection(&CriticalSection);
// access name…
LeaveCriticalSection(&CriticalSection);
WaitForSingleObject (hEvent, INFINITE) ;
DeleteCriticalSection(&CriticalSection);
CloseHandle (hEvent);
system("pause");
}
另一方面,我可以编写自己的 strcpy 来支持 volatile。 但这很奇怪。 因为如果是这样,那么我每次使用 volatile 时都必须编写自己的 I/O 流(或那些复杂的函数)?
再次感谢您的回答。
【问题讨论】:
-
简单回答:删除
volatile。在任何情况下你都想避免什么优化? -
顺便说一句,volatile 对线程安全没有帮助。
-
@Yochai:在 Visual C++ 中确实如此,而且这个问题被如此标记。
-
我认为 Charles Bailey 和 6502 是对的。我的代码中不需要“易失性”。我已经使用临界区来防止波动。
标签: c++ c visual-c++ volatile