C++11 で、リクエスト ループのタイプ (Web リクエスト ループの一部として) が与えられた場合に、キャッチされたシグナルに対して安全でないコードを実行する最も安全な (そして最も効率的な) 方法は何ですか? たとえば、Linux コマンド ラインから SIGUSR1 をキャッチすると、次のようになります。kill -30 <process pid>
次に発生するリクエストで「安全でないコード」が実行されることは許容されます。安全でないコードが実行される前にシグナルが複数回発生しても、情報は失われません。
たとえば、私の現在のコードは次のとおりです。
static bool globalFlag = false;
void signalHandler(int sig_num, siginfo_t * info, void * context) {
globalFlag = true;
}
void doUnsafeThings() {
// thigns like std::vector push_back, new char[1024], set global vars, etc.
}
void doRegularThings() {
// read filesystem, read global variables, etc.
}
void main(void) {
// set up signal handler (for SIGUSR1) ...
struct sigaction sigact;
sigact.sa_sigaction = onSyncSignal;
sigact.sa_flags = SA_RESTART | SA_SIGINFO;
sigaction(SIGUSR1, &sigact, (struct sigaction *)NULL);
// main loop ...
while(acceptMoreRequests()) { // blocks until new request received
if (globalFlag) {
globalFlag = false;
doUnsafeThings();
}
doRegularThings();
}
}
メインループのテスト+ globalFlagブール値の設定に問題がある可能性があることを私は知っています。
編集:if (globalFlag)
テストはかなりタイトなループで実行され、「時折の」偽陰性は許容されます。しかし、とにかく Basile Starynkevitch のソリューションには最適化がないと思いますか?