91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何分析基于linux threads-2.3的線程屏障

發布時間:2021-12-09 09:28:51 來源:億速云 閱讀:112 作者:柒染 欄目:大數據

這篇文章給大家介紹如何分析基于linux threads-2.3的線程屏障,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

線程屏障是線程同步的一個方式。線程執行完一個操作后,可能需要等待其他線程也完成某個動作,這時候,當前該線程就會被掛起,直到其他線程也完成了某個操作,最后所有線程被喚醒。屏障主要有三個函數。

intpthread_barrier_wait(pthread_barrier_t *barrier){  pthread_descr self = thread_self();  pthread_descr temp_wake_queue, th;  int result = 0;
 __pthread_lock(&barrier->__ba_lock, self);
 /* If the required number of threads have achieved rendezvous... */  // pthread_barrier_wait被調用的次數達到閾值,__ba_present + 1 == __ba_required  if (barrier->__ba_present >= barrier->__ba_required - 1)    {      /* ... then this last caller shall be the serial thread */      result = PTHREAD_BARRIER_SERIAL_THREAD;      /* Copy and clear wait queue and reset barrier. */      // 被阻塞的線程隊列      temp_wake_queue = barrier->__ba_waiting;      // 重置字段      barrier->__ba_waiting = NULL;      barrier->__ba_present = 0;    }  else    {      result = 0;      // 執行pthread_barrier_wait一次,加一      barrier->__ba_present++;      // 插入等待隊列      enqueue(&barrier->__ba_waiting, self);    }
 __pthread_unlock(&barrier->__ba_lock);  // 調用pthread_barrier_wait的次數還不夠  if (result == 0)    {      /* Non-serial threads have to suspend */      // 掛起當前線程      suspend(self);      /* We don't bother dealing with cancellation because the POSIX         spec for barriers doesn't mention that pthread_barrier_wait         is a cancellation point. */    }  else    {      /* Serial thread wakes up all others. */      // 喚醒其他的線程      while ((th = dequeue(&temp_wake_queue)) != NULL)  restart(th);    }
 return result;}
intpthread_barrier_init(pthread_barrier_t *barrier,        const pthread_barrierattr_t *attr,        unsigned int count){  if (count == 0)     return EINVAL;
 __pthread_init_lock(&barrier->__ba_lock);  // 需要執行pthread_barrier_wait的次數  barrier->__ba_required = count;  // 已經調用pthread_barrier_wait的次數  barrier->__ba_present = 0;  // 調用pthread_barrier_wait被阻塞的線程隊列  barrier->__ba_waiting = NULL;  return 0;}
intpthread_barrier_destroy(pthread_barrier_t *barrier){  // 有線程在等待  if (barrier->__ba_waiting != NULL) return EBUSY;  return 0;}

從代碼里我們知道,屏障的本質就是計數,還沒有達到某個數的時候,當前線程就被阻塞,等到最后一個線程執行pthread_barrier_wait函數并且得到了某個數的時候,全部線程被喚醒。

關于如何分析基于linux threads-2.3的線程屏障就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

中西区| 柳河县| 富源县| 澄城县| 富蕴县| 双流县| 乌拉特前旗| 天柱县| 平潭县| 阿拉尔市| 丹江口市| 北宁市| 隆回县| 加查县| 洪洞县| 涪陵区| 富宁县| 杂多县| 平山县| 河曲县| 昌图县| 平谷区| 荃湾区| 色达县| 武胜县| 增城市| 上栗县| 乌审旗| 格尔木市| 富裕县| 临夏县| 石渠县| 大同市| 东海县| 偏关县| 麟游县| 柘城县| 汾西县| 胶州市| 隆尧县| 张家界市|