gpt4 book ai didi

multithreading - 创建一个将一直阻塞直到被n/2个以上线程调用的函数(伪代码)

转载 作者:行者123 更新时间:2023-12-03 12:48:06 31 4
gpt4 key购买 nike

n线程。我正在尝试实现一个函数(伪代码),该函数(如果被线程调用)将直接阻止。如果每个线程被超过n/2线程调用,则每个线程将被阻塞,并且该函数将停止阻塞线程。如果调用该函数的n/2个线程以上,则该函数将不再阻止其他线程,而是立即返回。
我是这样做的,但是我不确定我是否正确地完成了最后一部分,如果超过了n/2线程调用该函数,函数将立即返回吗? :S
(高度赞赏伪代码,因为这样我就有更好的机会来理解它!:))

int n = total amount of threads
sem waiter = 0
sem mutex = 1
int counter = 0

function void barrier()
int x
P(mutex)
if counter > n / 2 then
V(mutex)
for x = 0; x <= n / 2; x++;
V(waiter)
end for
end if
else
counter++
V(mutex)
P(waiter)
end else
end function

最佳答案

您所描述的是一个不可重置的障碍。 Pthreads具有屏障实现,但是它具有重置的多样性。
要使用pthreads实现您想要的功能,您将需要一个互斥锁,一个条件变量和一个共享计数器。进入该函数的线程将锁定互斥锁并检查计数器。如果还没有足够的其他线程到达,则它将等待CV,否则它将广播给它以唤醒所有等待的线程。如果您愿意,可以使其成为提示广播音阶的线索。例子:

struct my_barrier {
pthread_mutex_t barrier_mutex;
pthread_cond_t barrier_cv;
int threads_to_await;
};

void barrier(struct my_barrier *b) {
pthread_mutex_lock(&b->barrier_mutex);
if (b->threads_to_await > 0) {
if (--b->threads_to_await == 0) {
pthread_cond_broadcast(&b->barrier_cv);
} else {
do {
pthread_cond_wait(&b->barrier_cv, &b->barrier_mutex);
} while (b->threads_to_await);
}
}
pthread_mutex_unlock(&b->barrier_mutex);
}
更新:伪代码
或者因为伪代码表示对您很重要,所以伪代码语言中的问题与问题中使用的语言类似:
int n = total amount of threads
mutex m
condition_variable cv
int to_wait_for = n / 2

function void barrier()
lock(mutex)

if to_wait_for == 1 then
to_wait_for = 0
broadcast(cv)
else if to_wait_for > 1 then
to_wait_for = to_wait_for - 1
wait(cv)
end if

unlock(mutex)
end function
这比伪代码稍高一点,因为它不假定互斥体是作为信号量实现的。 (对于标记了的pthreads,需要一个pthreads互斥体而不是一个信号量,才能使用pthreads条件变量)。它还省略了处理等待条件变量以及初始化互斥锁和cv时突然唤醒的真实C代码的详细信息。同样,它以变量的形式呈现它们,就像它们都是全局变量一样-可以在实践中以这种方式实现此函数,但是它的形式很差。
还要注意,它假定条件变量的pthreads语义为:WAITINGcv会暂时释放互斥锁,允许其他线程将其锁定,但是等待cv的线程将重新获取互斥锁,然后自身继续等待。 。

关于multithreading - 创建一个将一直阻塞直到被n/2个以上线程调用的函数(伪代码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64267711/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com