0
我的程序的每个线程都有自己的日志文件。在我的SIGHUP
处理程序中,我想通知那些线程,当新的日志消息到达时,他们需要重新打开它们的日志文件。在多线程中延迟无效的东西
我想要一个基于标志和计数器的无锁解决方案。 (我有一个线程本地上下文结构用于其他目的,所以我可以在那里添加新的字段)。
如果只是一个记录线程,我会做:
static int need_reopen = 0;
void sighancont(int signo)
...
case SIGHUP:
need_reopen = 1;
break;
...
}
void log(char *msg) {
if (need_reopen) {
need_reopen = 0;
reopen_log();
}
...
}
当然,如果有多个线程的日志记录,一个简单的标志不会做。我正在考虑这样的事情:
static volatile int reopen_counter = 0;
void sighancont(int signo)
...
case SIGHUP:
__sync_fetch_and_add(&reopen_counter, 1);
break;
...
}
void log(struct ctx_st *ctx, char *msg) {
int c = reopen_counter;
if (ctx->reopen_counter != c) {
ctx->reopen_counter = c;
reopen_log();
}
...
}
这种方式日志记录线程应该赶上全局计数器。如果程序多次收到SIGHUP,日志文件将只能重新打开一次。
我看到唯一的方法来打破这个 - 发送SIGHUP〜40亿次。
是否有更好的(但仍然很简单)算法,例如:参考计数?
您的代码中有数据竞争。如果值不是原子的,则无法从多个线程读取和修改相同的变量。 – SergeyA
@SergeyA in sighancont()或log()?如果你的意思是2个concurren SIGHUPS,我可以和 – basin
住在一起:) – SergeyA