За std::thread t(foo);
имеет ли смысл иметь foo [[noreturn]] () {...}
? Например для отдельного потока (используется как своего рода демон до завершения приложений)?
Будет ли полезным для gcc / clang пометить функцию, используемую для потока, с помощью [[noreturn]]?
Функции потока обычно возвращают. Так что нет, они не должны быть отмечены [[noreturn]]
,
Если они не закодированы, чтобы иметь бесконечный цикл, блокировать навсегда или вызывать функции, которые завершают поток или процесс. В этом случае вы можете отметить их как noreturn
,
Обратите внимание, что если вы используете низкоуровневые функции, такие как pthread_create
создать поток или другую функцию, определение которой недоступно во время компиляции, noreturn
Атрибут не будет влиять на код, который вызывает вашу функцию через указатель.
Возвращаемое значение функции потока отдельного потока игнорируется.
Поток не создает новый процесс и не использует fork или exec, он создает поток, который обязательно должен в конечном итоге вернуться. Если ваша функция потока никогда не вернется, вы будете зависать std::thread::join
Я ожидаю, что это (конструкция std :: thread) будет своего рода изменением fork + execve в моей системе, и, если оно будет успешным, к нему будет нечего возвращаться.
std :: thread создает отдельный поток (в том же процессе). fork + execve работают над несколькими процессами.
Будет ли полезным для gcc / clang пометить функцию, используемую для потока, с помощью [[noreturn]]?
Только если функция, которую вы передаете в std :: thread, не возвращается (то есть, если функция вызывает std :: exit, std :: terminate, во всех случаях выбрасывает или запускает бесконечный цикл и так далее)