我在2個線程之間共享一個變量。我使用volatile來避免優化。函數沒有volatile。怎麼修?
但是,它顯示了在strcpy中沒有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都必須編寫自己的I/O流(或那些複雜的函數)?
Thx a再次回答。
簡單的回答:刪除'volatile'。在任何情況下你想避免哪種優化? – 2012-07-25 05:15:34
順便說一句,揮發性不利於線程安全。 – 2012-07-25 05:22:35
@Yochai:在Visual C++中它有,而且這個問題是如此標記的。 – 2012-07-25 05:38:14