我有一個在程式啟動時啟動并連續運行的執行緒(我正在使用 pthreads)。我需要從主執行緒向執行緒發送命令。我可以設定一個全域變數,但這似乎有風險,因為如果輔助執行緒和主執行緒嘗試同時訪問它呢?我可以將變數包裝在互斥鎖中,但這有必要嗎?如果我只是在主執行緒中放置一個按鈕來執行這樣的代碼會怎樣:
// main thread
if(!trigger_variable)
trigger_variable=1;
然后,在第二個執行緒中,我使用了這個:
// other thread
if(trigger_variable){
do_something();
trigger_variable=0;
}
這是否足以避免使用互斥鎖?
uj5u.com熱心網友回復:
trigger_variable只要A是原子型別就可以作業;對于常規/非原子型別,它會呼叫未定義的行為,因為您將有兩個執行緒在沒有任何同步的情況下讀取和寫入相同的記憶體。
但是,設定共享變數并不完全是“發送命令”,而是設定一個共享狀態,因此我不會為此目的將其稱為“防彈”。例如,如果您想快速連續發送兩個命令,則很難保證都收到了,因為對變數的第二次更改可能會在子執行緒有機會看到第一個值之前覆寫第一個.
如果您希望能夠正確發送命令(例如,每個命令都由子執行緒接收,按照命令發送的順序),一種相對簡單的方法是讓主執行緒創建一個管道并給出到子執行緒的管道的資料讀取檔案描述符。然后主執行緒可以在它希望子執行緒做某事時在資料寫入檔案描述符上write()一個位元組,并且子執行緒可以read()該位元組并做出適當的反應。
uj5u.com熱心網友回復:
根據官方 ISO C11 標準的 §5.1.2.4 ?25 和 ?4,兩個不同的執行緒使用非原子操作以無序方式讀取和寫入同一內??存位置會導致未定義的行為。
但是,如果您改用原子型別或原子操作 libary,那么您的計劃應該可行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/349305.html
上一篇:信號量中的原子指令
下一篇:model.predict()==ValueError:檢查輸入時出錯:預期flatten_input有3個維度,但得到了形狀為(1,2)的陣列
