2012-05-22 52 views
0

我有一個Visual C++程序,用FILE* fp = fopen(...)在一個線程中打開一個文件。我希望該線程在事件對象上阻塞,而另一個線程讀取該文件,然後在阻塞的線程完成時發出信號,然後關閉該文件。因爲線程之間共享fp,所以我宣佈它爲volatile FILE* fp。但是,fread()不會接受volatile作爲其FILE*參數。我試圖用一個本地指針,在該線程將調用fread()FILE* fpLocal = fp;,但是這讓我這個:爲什麼不能將FILE *分配給FILE *?

Error: a value of type "volatile FILE*" cannot be assigned to an entity of type "FILE*" 

,這自然有我擔心,也許我試圖打開一個文件犯了一個錯誤在一個線程中,並在另一個線程中讀取它,但我不明白爲什麼(還)。

有人可以幫助我嗎?爲什麼我不能將volatile FILE*分配給FILE*

+12

放下'volatile'。它與線程無關。 –

+2

由於無法爲'FILE *'指定'const FILE *',但是作爲@ R.MartinhoFernandes指出的原因,您不能將'volatile FILE *'指定給'FILE * 「揮發性」在這裏是非常錯誤的開始。 – ildjarn

+2

volatile唯一保證的是,每次訪問volatile變量都會導致加載/存儲(和AFAIK,這對於將內存映射到I/O設備等的系統很有用。標準,例如,甚至沒有提到「線程」這個詞) – ArjunShankar

回答

3

爲什麼我不能將volatile FILE*指定爲FILE*

因爲C++具有嚴格的類型檢查,並且您不能指定彼此不匹配的類型。
如果是這種情況,需要使用鑄造操作符,但需要注意的是,錯誤地使用它們可能會導致未定義的行爲。
此行爲與const限定符相同。

作爲已經在評論中提到的一個備註,volatile是不是去這裏的方式。

+0

不斷變化會使一切變得簡單,但現在我必須問爲什麼這是安全的。我認爲volatile是你如何防止一個線程改變另一個線程可能讀取的緩存值。這就是我從MSDN收集到的信息,它說:「volatile關鍵字是一種類型限定詞,用於聲明程序中的某個對象可以通過操作系統,硬件或併發執行的線程等方式進行修改。」 –

+0

@StevensMiller不提供任何排序​​,原子性或可視性保證。它只意味着編譯器不能通過假定值不會改變來進行某些優化。 –

+1

@StevensMiller:這應該讓你開始:[爲什麼volatile在多線程C或C++編程中不被認爲是有用的](http://stackoverflow.com/questions/2484980/why-is-volatile-not-considered-useful- in-multithreaded-c-or-c-programming) –

相關問題