Как получить идентификатор потока как целое число на BSD в C / C ++? - PullRequest
1 голос
/ 23 октября 2010

Кто-нибудь знает, чтобы получить текущий идентификатор потока как целое число в BSD?

я нашел это

#ifdef RTHREADS
  299     STD     { pid_t sys_getthrid(void); }
  300     STD     { int sys_thrsleep(void *ident, int timeout, void *lock); }
  301     STD     { int sys_thrwakeup(void *ident, int n); }
  302     STD     { int sys_threxit(int rval); }
  303     STD     { int sys_thrsigdivert(sigset_t sigmask); }
#else
  299     UNIMPL
  300     UNIMPL
  301     UNIMPL
  302     UNIMPL
  303     UNIMPL
#endif

и пробовал (долго) syscall (229), но не работает (он вылетает). В Linux я могу получить идентификатор потока с помощью системного вызова (long) syscall (224), который дает мне целое число (обычно 4 цифры). Кто-нибудь может помочь ?! Спасибо.

Ответы [ 2 ]

4 голосов
/ 04 ноября 2010

Нет такой вещи, как "BSD". Каждая система * BSD совершенно другая, особенно когда дело касается потоков. Даже в рамках одного проекта, такого как FreeBSD, существуют различные реализации pthread (libc_r, kse, thr), которые различаются между версиями os и конфигурацией пользователя.

Сказав, что на FreeBSD-8 должно быть int thr_self(long *id) в / usr / include / sys / thr.h , а на достаточно свежем NetBSD lwpid_t _lwp_self(void) в / usr /include/lwp.h.

Для большего количества платформ вы можете взглянуть на int get_unix_tid (void) в источнике вина.

0 голосов
/ 23 октября 2010

Узнайте, какиеможет быть включен в ваши единицы перевода C (путем проверки пути (ов) включает путь (и)).там определен pid_t.Это целочисленный тип со знаком, но таких несколько.Он может легко быть шире, чем long.

Документация Open Groups sys / types.h обещает "Реализация должна поддерживать одну или несколько сред программирования, в которых ширина blksize_t, pid_t, size_t, ssize_t, suseconds_t и useconds_t не превышают ширину типа long. Названия этих сред программирования можно получить с помощью функции confstr () или утилиты getconf. "Таким образом, вы, вероятно, можете привести pid_t к long (или, по крайней мере, использовать getconf, чтобы узнать, что вам нужно сделать, чтобы оказаться в ситуации, когда pid_t можно безопасно привести к long).

См. C ЯзыкПоправка: строки формата printf для обсуждения того, почему то, что вы хотите сделать, является сложным, не может быть записано переносимым образом и может внезапно оборваться в будущем.

...