您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何分析基于linux threads-2.3的線程屏障,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
線程屏障是線程同步的一個(gè)方式。線程執(zhí)行完一個(gè)操作后,可能需要等待其他線程也完成某個(gè)動(dòng)作,這時(shí)候,當(dāng)前該線程就會(huì)被掛起,直到其他線程也完成了某個(gè)操作,最后所有線程被喚醒。屏障主要有三個(gè)函數(shù)。
int
pthread_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被調(diào)用的次數(shù)達(dá)到閾值,__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. */
// 被阻塞的線程隊(duì)列
temp_wake_queue = barrier->__ba_waiting;
// 重置字段
barrier->__ba_waiting = NULL;
barrier->__ba_present = 0;
}
else
{
result = 0;
// 執(zhí)行pthread_barrier_wait一次,加一
barrier->__ba_present++;
// 插入等待隊(duì)列
enqueue(&barrier->__ba_waiting, self);
}
__pthread_unlock(&barrier->__ba_lock);
// 調(diào)用pthread_barrier_wait的次數(shù)還不夠
if (result == 0)
{
/* Non-serial threads have to suspend */
// 掛起當(dāng)前線程
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;
}
int
pthread_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);
// 需要執(zhí)行pthread_barrier_wait的次數(shù)
barrier->__ba_required = count;
// 已經(jīng)調(diào)用pthread_barrier_wait的次數(shù)
barrier->__ba_present = 0;
// 調(diào)用pthread_barrier_wait被阻塞的線程隊(duì)列
barrier->__ba_waiting = NULL;
return 0;
}
int
pthread_barrier_destroy(pthread_barrier_t *barrier)
{
// 有線程在等待
if (barrier->__ba_waiting != NULL) return EBUSY;
return 0;
}
從代碼里我們知道,屏障的本質(zhì)就是計(jì)數(shù),還沒有達(dá)到某個(gè)數(shù)的時(shí)候,當(dāng)前線程就被阻塞,等到最后一個(gè)線程執(zhí)行pthread_barrier_wait函數(shù)并且得到了某個(gè)數(shù)的時(shí)候,全部線程被喚醒。
關(guān)于如何分析基于linux threads-2.3的線程屏障就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。