Я работаю над приложением, которое выполняет множество процессов, которые одновременно используют много потоков. Когда что-то не получается и поток паникует, 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.





Боюсь, это невозможно: имя потока управляется независимо от ОС , и задается только в двух местах стандартной библиотеки: при настройке main() , и при создании темы. Не существует общедоступного API, который изменяет его для текущего потока (вы можете запросить его, если считаете, что это важно).
Вы можете создать новую тему и сразу join() ее.
@javier Еще более невозможно, потому что вам потребуется доступ к данным, которые являются частными для порожденного процесса.
Один из способов уточнить, какой процесс потерпел крах, — настроить собственный обработчик паники. Хорошим примером этого является среда выполнения 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);
}));
}
Отображает этот вывод:
Panic in process: Program 1
thread 'main' panicked at 'something bad happened', src/main.rs:3:5
Этот ответ решает мою проблему. Хотя в заголовке моего вопроса указано, как переименовать основной поток. Я оставлю принятый ответ как есть. В любом случае, большое спасибо. Это было то, что мне было нужно.
Я понимаю. Я создаю процессы из основной программы ржавчины. Есть ли способ изменить имя основного потока перед запуском процесса, перед настройкой main()? Или это то же самое?