sem_post没有优先考虑其他线程中的sem_wait调用

时间:2015-12-30 14:47:06

标签: c multithreading pthreads semaphore exit

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

d1 <- structure(list(SIZE = 2:4, TIME.A = c(59.21, 54.32, 5100.88), TIME.B = c(511.11, 514.31, 566.9), 
                     TIME.D = c(55.31, 53.91, 52.11), TIME.E = c(52.16, 56.12, 545.73)), 
                .Names = c("SIZE", "TIME.A", "TIME.B", "TIME.D", "TIME.E"), class = "data.frame", row.names = c(NA,  -3L))

d2 <- structure(list(SIZE = 2:4, TIME.A = c(9.21, 4.32, 100.88), TIME.B = c(11.11, 14.31, 66.9), 
                     TIME.D = c(5.31, 3.91, 2.11), TIME.E = c(2.16, 6.12, 45.73)), 
                .Names = c("SIZE", "TIME.A", "TIME.B", "TIME.D", "TIME.E"), class = "data.frame", row.names = c(NA, -3L))

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

1 个答案:

答案 0 :(得分:1)

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

#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
}