gpt4 book ai didi

c - sem_post 不会优先考虑其他线程中的 sem_wait 调用

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

我正在做我的项目,正确清理所有内容并将所有缓冲的日志消息保存到文件等是至关重要的。我正在从另一个线程调用退出,我正在考虑使用信号量等待在程序完全退出之前在主线程中进行清理。问题是,当我从使用 atexit 注册的退出处理程序调用 sem_post 时,sem_wait 不会立即递减信号量,因此退出处理程序中的 sem_wait 将立即退出,因为信号量大于零。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <semaphore.h>
#include <pthread.h>

static sem_t sem;

void *do_work(void *arg) {
// if something fails
printf("Something failed!\n");
exit(1);
}

void exit_handler() {
sem_post(&sem); // wake up main thread
sem_wait(&sem); // wait for cleanup in main
sem_destroy(&sem);
}

int main() {
pthread_t worker_thread;

sem_init(&sem, 0, 0);
atexit(exit_handler);

pthread_create(&worker_thread, NULL, do_work, NULL);

sem_wait(&sem); // block this thread until work is done

// simulate some cleanup
usleep(1000000);
printf("This never gets called!\n");

sem_post(&sem); // destroy semaphore
}

example证明了我的问题。这个问题有什么解决办法吗?我不能将清理放在我的退出处理程序中,因为我在 main 函数中有很多本地资源需要在我的实际程序中清理。

最佳答案

在调用 sem_post() 之后,您无法控制哪个线程将从 sem_wait() 返回。您需要使用两个信号量:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <semaphore.h>
#include <pthread.h>

static sem_t wakeupMain;
static sem_t cleanupDone;

void *do_work(void *arg) {
// if something fails
printf("Something failed!\n");
exit(1);
}

void exit_handler() {
sem_post(&wakeupMain); // wake up main thread
sem_wait(&cleanupDone); // wait for cleanup in main
sem_destroy(&wakeupMain);
sem_destroy(&cleanupDone);
}

int main() {
pthread_t worker_thread;

sem_init(&wakeupMain, 0, 0);
sem_init(&cleanupDone, 0, 0);
atexit(exit_handler);

pthread_create(&worker_thread, NULL, do_work, NULL);

sem_wait(&wakeupMain); // block this thread until work is done

// simulate some cleanup
usleep(1000000);
printf("This never gets called!\n");

sem_post(&cleanupDone); // destroy semaphore
}

关于c - sem_post 不会优先考虑其他线程中的 sem_wait 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34531697/

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