兩個(gè)線程讀寫同一個(gè)隊(duì)列 如何實(shí)現(xiàn)多個(gè)線程寫,一個(gè)線程讀的隊(duì)列,并且所有線程?
如何實(shí)現(xiàn)多個(gè)線程寫,一個(gè)線程讀的隊(duì)列,并且所有線程?首先,我們?cè)O(shè)計(jì)了一個(gè)有一個(gè)線程要寫,一個(gè)線程要讀的隊(duì)列,它有兩個(gè)指針要讀和寫。閱讀線程:1。首先判斷讀寫指針。如果讀取指針==寫入指針,則不返回?cái)?shù)據(jù)
如何實(shí)現(xiàn)多個(gè)線程寫,一個(gè)線程讀的隊(duì)列,并且所有線程?
首先,我們?cè)O(shè)計(jì)了一個(gè)有一個(gè)線程要寫,一個(gè)線程要讀的隊(duì)列,它有兩個(gè)指針要讀和寫。閱讀線程:1。首先判斷讀寫指針。如果讀取指針==寫入指針,則不返回?cái)?shù)據(jù),否則讀取數(shù)據(jù),然后讀取指針1。寫入線程:1。(如果使用循環(huán)隊(duì)列)在寫入線程進(jìn)入后檢查讀寫指針。如果讀指針=寫指針1,那么寫線程進(jìn)入線程開關(guān)并繼續(xù)寫,直到讀指針移動(dòng)。(如果數(shù)據(jù)是可以丟棄的實(shí)時(shí)數(shù)據(jù),則不能進(jìn)行判斷)//為了對(duì)數(shù)據(jù)進(jìn)行原子化操作,最好將指針保存在循環(huán)隊(duì)列中。2寫指針來寫數(shù)據(jù),1。接下來,考慮當(dāng)多個(gè)線程同時(shí)寫入時(shí)如何實(shí)現(xiàn)。首先,申請(qǐng)TLS值(建議使用運(yùn)行時(shí),而不是API,因?yàn)锳PI進(jìn)程最多只能申請(qǐng)255,這樣很容易用完)。然后,每個(gè)線程保存上面實(shí)現(xiàn)的讀寫隊(duì)列,并將隊(duì)列地址放入一個(gè)結(jié)構(gòu)中。每個(gè)寫線程將數(shù)據(jù)寫入自己線程所擁有的隊(duì)列,每個(gè)寫線程將數(shù)據(jù)寫入需要保存的時(shí)間計(jì)數(shù)(getsystemtimeasfiletime)以判斷每個(gè)隊(duì)列中節(jié)點(diǎn)的順序。讀取線程依次遍歷所有隊(duì)列,取出隊(duì)列中的值,并按時(shí)間計(jì)數(shù)的順序進(jìn)行處理。