gpt4 book ai didi

c - 阻塞直到事件完成

转载 作者:太空宇宙 更新时间:2023-11-04 06:44:37 25 4
gpt4 key购买 nike

海湾合作委员会 4.4.2 c89

我有一个必须运行的函数 (config_relays)。它调用一个名为 set_relay 的 API 函数,然后代码必须等待 set_relay 事件完成后才能继续。 set_relay 是任何异步调用。

void run_processes()
{
switch()
{
case EV_RELAY_SET:
break;
}
}


void config_relays()
{
set_relay();

/* Wait until EV_RELAY_SET has fired */
/* Cannot do init_relay until set_relay event has fired - has to block here */
init_relay();
}

我想我可以将 init_relay() 放在开关中。但是,该事件用于其他用途,而不仅仅是用于初始化继电器。我真的很想在 config_relays 函数中处理所有事情。

在 C# 中,您可以使用自动重置来完成此操作。 C有没有类似的东西。

非常感谢任何建议,

最佳答案

正如 Anders 所写,有条件的等待是解决方案。在 POSIX 线程 API 中,您将 pthread_cond_wait 与互斥锁一起使用。这很容易,以下模式有效:

int ready_flag = 0;
pthread_mutex_t ready_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t ready_cond = PTHREAD_COND_INITIALIZER;

void wait_ready()
{
pthread_mutex_lock(&ready_mutex);
while(!ready_flag) {
pthread_cond_wait(&ready_cond, &ready_mutex);
}
pthread_mutex_unlock(&ready_mutex);
}


void set_ready(int ready)
{
pthread_mutex_lock(&ready_mutex);
ready_flag = ready;

pthread_cond_signal(&ready_cond);
// or using pthread_cond_broadcast(&ready_cond);

pthread_mutex_unlock(&ready_mutex);

}

pthread_cond_signal 和pthread_cond_broadcast 的区别在于,如果有多个线程等待标志被设置,pthread_cond_signal 只释放一个线程,而broadcast 释放所有线程。

并不是围绕您的条件创建的 while 循环由您决定,您可以测试多个条件或做任何您想做的事情。代码模式确保您的测试是在 protected 变量上执行的,这样竞争条件永远不会导致问题,例如

while(resource_a_busy && resource_b_busy) ...

这是一个典型的问题,其中两种资源状态都必须由互斥体保护。

cond_wait 可以从循环中移除,但是它会将 wait_ready 转换为消耗 CPU 的轮询循环,而 pthread_wait_cond 不消耗任何 CPU。

有一些移植库在 pthreads 之上提供类似 Win32 的 API,还有一些库在 Win32 事件 API 之上提供类似 phread 的 API,后者称为 [Pthreads-w32] 1

关于c - 阻塞直到事件完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2551529/

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