簡體   English   中英

從不同的線程訪問和寫入數組

[英]accessing and writing to array from different threads

我有一個簡單的字符串字符串數組,並且試圖通過不同的多個線程訪問和寫入它們。 實際上,我固定了char[10]大小,因為每個字符串的長度始終小於500。我知道是否可以從不同的線程訪問它,而無需進行修改,就不會有任何問題。

當我從不同的線程寫入那些字符串時,以及當我從不同的線程在arr[2]處更改某些字符串時,都會出現問題,因為線程可能彼此先行運行並且輸出是不可預測的,所以結果是無法預測的通常混合使用這兩個字符串。 這是因為字符串由多個字符組成,並且不同的線程同時訪問同一字符串的不同字符,從而產生混合字符串。

我研究了互斥鎖原子變量。 互斥鎖需要鎖定變量,然后寫入字符串,然后將其解鎖。 這是解決問題的好方法嗎? 我試圖理解原子方法,但是它直奔我的腦海:/

另一個問題是,如果該數組是由真實的原子操作(如布爾數組)組成的,那么我只需要為每個索引設置true或false,那么這個問題也會發生嗎? 由於沒有多個字符,因此問題不應該存在,對嗎?

我的個人主張是:每個字符串都有一個互斥量,然后線程在這樣做之前先為他們要寫入的字符串獲取互斥量。

與為所有字符串使用一個全局互斥鎖相比,這允許並行訪問不同的字符串,因此很有可能獲得更好的性能。

但是請注意,如果未正確處理多個互斥鎖,則始終會帶來死鎖的風險。 避免這種情況的一種方法是實現每個線程一次不持有多個互斥量。 然后,您將立即保存。

如果一個線程中需要多個互斥量,那么避免死鎖的一種簡單策略就是始終在每個線程中以相同的順序獲取互斥量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM