Говорят, летучее необходим для обработчика сигнала, например,летучее для обработчика сигнала и многопоточного
volatile int flag = 1; // volatile is needed here?
void run() {
while(flag) { /* do someting... */ }
}
void signal_handler(int sig) {
flag = 0;
}
int main() {
signal(SIGINT, sig_handler);
run();
// ...
}
Говорят, летучие часто не используются в многопоточной. Но как насчет аналогичного случая, подобного выше в многопоточности:
int flag = 1; // is volatile needed here?
void thread_function() {
while(flag) { /* do someting... */ }
}
int main() {
// pthread_create() to create thread_function()...
sleep(10); // let thread_function run for 10 seconds
flag = 0;
// ...
}
Следует ли использовать в качестве замены ключевое слово volatile? Компилируются ли эти два случая одним и тем же способом?
'volatile' недостаточно [обычно] для операций interthread (например, блокировки, индексов очереди звонков и т. Д.). Но здесь вы используете флаг «run». Только 1 автор ('main'). И в обоих случаях он должен быть «изменчивым». Во втором случае предположим, что функция func является 'while (flag) do_stuff();' '' '' '' '' '' '' '' '' '' '' 'мягкий способ сообщить потокам выйти из своих циклов, выполнить очистку и выйти. Вы можете объединить 1-й и 2-й и обработать обработчик сигнала 'флаг' для потоков. Многое для этого для потоков требует 'pthread_mutex_t' et. al. и т. д. –