Переименовать основной поток в Rust

Я работаю над приложением, которое выполняет множество процессов, которые одновременно используют много потоков. Когда что-то не получается и поток паникует, rust выводит: thread 'main' panicked at 'explicit panic'. Я хотел бы использовать эти сообщения для целей отладки, имея возможность идентифицировать паникующий процесс по его имени, но в этом случае все процессы имеют имя основного потока.

Как я могу изменить имя основного потока?

Я знаю, что могу изменить имя дочернего потока с помощью std::thread::Builder, но это не работает для текущего потока.

Я также пытался использовать вызов pthread_setname_np (я использую систему Linux):

use libc::{pthread_self, pthread_setname_np};
use std::{ffi::CString, thread};

fn main() {

    // Set the name of the main thread
    let name = CString::new("new_name").unwrap();
    unsafe {
        pthread_setname_np(pthread_self(), name.as_ptr());
    }

    panic!();
}

Выполнение этого с cargo run все еще вызывает панику с именем main.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Боюсь, это невозможно: имя потока управляется независимо от ОС , и задается только в двух местах стандартной библиотеки: при настройке main() , и при создании темы. Не существует общедоступного API, который изменяет его для текущего потока (вы можете запросить его, если считаете, что это важно).

Вы можете создать новую тему и сразу join() ее.

Я понимаю. Я создаю процессы из основной программы ржавчины. Есть ли способ изменить имя основного потока перед запуском процесса, перед настройкой main()? Или это то же самое?

javier 16.04.2023 20:06

@javier Еще более невозможно, потому что вам потребуется доступ к данным, которые являются частными для порожденного процесса.

Chayim Friedman 16.04.2023 20:26

Один из способов уточнить, какой процесс потерпел крах, — настроить собственный обработчик паники. Хорошим примером этого является среда выполнения Deno:

https://github.com/denoland/deno/pull/13145/files

Вот краткий пример того, как это сделать:

fn main() {
    set_panic_hook(format!("Program {}", 1));
    panic!("something bad happened");
}

fn set_panic_hook(process_name: String) {
    let orig_hook = std::panic::take_hook();
    std::panic::set_hook(Box::new(move |panic_info| {
        eprintln!("\nPanic in process: {process_name}");
        orig_hook(panic_info);
        std::process::exit(1);
    }));
}

Пример игровой площадки Rust

Отображает этот вывод:

Panic in process: Program 1
thread 'main' panicked at 'something bad happened', src/main.rs:3:5

Этот ответ решает мою проблему. Хотя в заголовке моего вопроса указано, как переименовать основной поток. Я оставлю принятый ответ как есть. В любом случае, большое спасибо. Это было то, что мне было нужно.

javier 19.04.2023 11:33

Другие вопросы по теме