pthreads

PTHREADS(7)     Ð ÑководÑÑво пÑогÑаммиÑÑа Linux     PTHREADS(7)



ÐÐЯ
       pthreads - ниÑи POSIX

ÐÐÐСÐÐÐÐ
       Ð POSIX.1 опÑеделÑн Ð½Ð°Ð±Ð¾Ñ Ð¸Ð½ÑеÑÑейÑов (ÑÑнкÑии,
       заголовоÑнÑе ÑайлÑ) Ð´Ð»Ñ ÑабоÑÑ Ñ Ð½Ð¸ÑÑми,
       более извеÑÑнÑми как ниÑи POSIX или Pthreads. Ð
       одном пÑоÑеÑÑе Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÑколÑко ниÑей,
       коÑоÑÑе вÑполнÑÑÑ Ð¾Ð´Ð½Ñ Ð¿ÑогÑаммÑ. ÐÑи ниÑи
       ÑабоÑаÑÑ Ñ Ð¾Ð±Ñей глобалÑной памÑÑÑÑ
       (ÑегменÑами даннÑÑ Ð¸ кÑÑи), но Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ниÑи
       еÑÑÑ ÑобÑÑвеннÑй ÑÑек (авÑомаÑиÑеÑкие
       пеÑеменнÑе).

       Также, в POSIX.1 ÑÑебÑеÑÑÑ, ÑÑÐ¾Ð±Ñ Ð½Ð¸Ñи имели
       обÑий диапазон дÑÑÐ³Ð¸Ñ Ð°ÑÑибÑÑов (Ñ. е., ÑÑи
       аÑÑибÑÑÑ Ð¿ÑоÑеÑÑа, а не ниÑи):

       -  иденÑиÑикаÑÐ¾Ñ Ð¿ÑоÑеÑÑа

       -  иденÑиÑикаÑÐ¾Ñ ÑодиÑелÑÑкого пÑоÑеÑÑа

       -  ÐденÑиÑикаÑÐ¾Ñ Ð³ÑÑÐ¿Ð¿Ñ Ð¿ÑоÑеÑÑов и ÑеанÑа

       -  УпÑавлÑÑÑий ÑеÑминал

       -  ÐденÑиÑикаÑоÑÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð¸ гÑÑппÑ

       -  ÐÑкÑÑÑÑе ÑайловÑе деÑкÑипÑоÑÑ

       -  ÐбÑÑнÑе блокиÑовки (ÑмоÑÑиÑе fcntl(2))

       -  ÐбÑабоÑÑики Ñигналов

       -  ÐаÑка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñежима доÑÑÑпа к ÑайлÑ
          (umask(2))

       -  ТекÑÑий каÑалог (chdir(2)) и коÑневой
          каÑалог (chroot(2))

       -  ÐнÑеÑвалÑнÑе ÑаймеÑÑ (setitimer(2)) и ÑаймеÑÑ POSIX
          (timer_create(2))

       -  ÐнаÑение ÑÑÑÑпÑивоÑÑи (setpriority(2))

       -  ÐгÑаниÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑеÑÑÑÑам (setrlimit(2))

       -  ÐзмеÑиÑели поÑÑÐµÐ±Ð»ÐµÐ½Ð¸Ñ Ð²Ñемени ЦР(times(2))
          и ÑеÑÑÑÑов (getrusage(2))

       Ðак и Ð´Ð»Ñ ÑÑека, в POSIX.1 опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð´ÑÑгие
       аÑÑибÑÑÑ, коÑоÑÑе ÑникалÑÐ½Ñ Ð² каждой ниÑи:

       -  ÐденÑиÑикаÑÐ¾Ñ Ð½Ð¸Ñи (Ñип даннÑÑ pthread_t)

       -  ÐаÑка Ñигналов (pthread_sigmask(3))

       -  ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ errno

       -  ÐлÑÑеÑнаÑивнÑй ÑÑек Ñигнала (sigaltstack(2))

       -  ÐлгоÑиÑм и пÑиоÑиÑÐµÑ Ð¿Ð»Ð°Ð½Ð¸ÑованиÑ
          ÑеалÑного вÑемени (sched(7))

       СледÑÑÑие ÑвойÑÑва еÑÑÑ ÑолÑко в Linux и Ñакже
       ÑникалÑÐ½Ñ Ð² каждой ниÑи:

       -  мандаÑÑ (ÑмоÑÑиÑе capabilities(7))

       -  ÐÑивÑзка к ЦР(sched_setaffinity(2))

   ÐозвÑаÑаемÑе знаÑÐµÐ½Ð¸Ñ Ð¸Ð· ÑÑнкÑий pthreads
       ÐолÑÑинÑÑво ÑÑнкÑий pthreads пÑи ÑÑпеÑном
       вÑполнении возвÑаÑÐ°ÐµÑ 0 или Ð½Ð¾Ð¼ÐµÑ Ð¾Ñибки в
       пÑоÑивном ÑлÑÑае. ÐамеÑим, ÑÑо ÑÑнкÑии pthreads
       не изменÑÑÑ errno. ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑнкÑии pthreads,
       коÑоÑÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²ÐµÑнÑÑÑ Ð¾ÑибкÑ, в POSIX.1-2001
       опÑеделено, ÑÑо ÑÑнкÑÐ¸Ñ Ð½Ð¸ÐºÐ¾Ð³Ð´Ð° не можеÑ
       завеÑÑиÑÑÑÑ Ñ Ð¾Ñибкой EINTR.

   ÐденÑиÑикаÑÐ¾Ñ Ð½Ð¸Ñи
       Ðаждой ниÑи пÑоÑеÑÑа назнаÑаеÑÑÑ ÑникалÑнÑй
       иденÑиÑикаÑÐ¾Ñ Ð½Ð¸Ñи (Ð¸Ð¼ÐµÐµÑ Ñип pthread_t). ÐÑоÑ
       иденÑиÑикаÑÐ¾Ñ Ð²Ð¾Ð·Ð²ÑаÑаеÑÑÑ Ð²ÑзÑваÑÑемÑ
       pthread_create(3), а в Ñамой ниÑи ÐµÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑ
       можно полÑÑиÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ pthread_self(3).

       ÐнÑÑÑи пÑоÑеÑÑа гаÑанÑиÑÑеÑÑÑ ÑникалÑноÑÑÑ
       иденÑиÑикаÑоÑов ниÑей (во вÑÐµÑ ÑÑнкÑиÑÑ pthreads,
       коÑоÑÑе пÑинимаÑÑ Ð°ÑгÑÐ¼ÐµÐ½Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑа
       ниÑи, подÑазÑмеваеÑÑÑ, ÑÑо Ñказана ниÑÑ Ð¸Ð·
       пÑоÑеÑÑа вÑзÑваÑÑего).

       СиÑÑема Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð²ÑоÑно иÑполÑзоваÑÑ
       иденÑиÑикаÑÐ¾Ñ Ð½Ð¸Ñи поÑле обÑединениÑ
       завеÑÑÑнной ниÑи или оÑÑоединениÑ
       завеÑÑÑнной ниÑи. Ð POSIX Ñказано: «ÐÑли
       пÑиложение пÑÑаеÑÑÑ Ð¸ÑполÑзоваÑÑ
       иденÑиÑикаÑÐ¾Ñ Ð½Ð¸Ñи, Ñ ÐºÐ¾ÑоÑÑй законÑилÑÑ ÑÑок
       жизни, Ñо поведение не пÑедÑказÑемо».

   ÐиÑебезопаÑнÑе ÑÑнкÑии
       ÐиÑебезопаÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ â ÑÑо ÑÑнкÑиÑ, коÑоÑÑÑ
       можно безопаÑно (Ñ. е., ÑÑо пÑиведÑÑ Ðº единÑм
       ÑезÑлÑÑаÑам незавиÑимо Ð¾Ñ Ð¾ÐºÑÑжениÑ) вÑзÑваÑÑ
       из неÑколÑÐºÐ¸Ñ Ð½Ð¸Ñей одновÑеменно.

       Ð POSIX.1-2001 и POSIX.1-2008 ÑÑебÑеÑÑÑ, ÑÑÐ¾Ð±Ñ Ð²Ñе ÑÑнкÑии,
       опиÑаннÑе в ÑÑандаÑÑе, бÑли
       ниÑебезопаÑнÑми, за иÑклÑÑением ÑледÑÑÑиÑ
       ÑÑнкÑий:

           asctime()
           basename()
           catgets()
           crypt()
           ctermid() еÑли пеÑедаÑÑÑÑ Ð°ÑгÑÐ¼ÐµÐ½Ñ Ð½Ðµ NULL
           ctime()
           dbm_clearerr()
           dbm_close()
           dbm_delete()
           dbm_error()
           dbm_fetch()
           dbm_firstkey()
           dbm_nextkey()
           dbm_open()
           dbm_store()
           dirname()
           dlerror()
           drand48()
           ecvt() [ÑолÑко POSIX.1-2001 (Ñдалена из POSIX.1-2008)]
           encrypt()
           endgrent()
           endpwent()
           endutxent()
           fcvt() [ÑолÑко POSIX.1-2001 (Ñдалена из POSIX.1-2008)]
           ftw()
           gcvt() [ÑолÑко POSIX.1-2001 (Ñдалена из POSIX.1-2008)]
           getc_unlocked()
           getchar_unlocked()
           getdate()
           getenv()
           getgrent()
           getgrgid()
           getgrnam()
           gethostbyaddr() [ÑолÑко POSIX.1-2001 (Ñдалена из POSIX.1-2008)]
           gethostbyname() [ÑолÑко POSIX.1-2001 (Ñдалена из POSIX.1-2008)]
           gethostent()
           getlogin()
           getnetbyaddr()
           getnetbyname()
           getnetent()
           getopt()
           getprotobyname()
           getprotobynumber()
           getprotoent()
           getpwent()
           getpwnam()
           getpwuid()
           getservbyname()
           getservbyport()
           getservent()
           getutxent()
           getutxid()
           getutxline()
           gmtime()
           hcreate()
           hdestroy()
           hsearch()
           inet_ntoa()
           l64a()
           lgamma()
           lgammaf()
           lgammal()
           localeconv()
           localtime()
           lrand48()
           mrand48()
           nftw()
           nl_langinfo()
           ptsname()
           putc_unlocked()
           putchar_unlocked()
           putenv()
           pututxline()
           rand()
           readdir()
           setenv()
           setgrent()
           setkey()
           setpwent()
           setutxent()
           strerror()
           strsignal() [добавлена в POSIX.1-2008]
           strtok()
           system() [добавлена в POSIX.1-2008]
           tmpnam() еÑли пеÑедаÑÑÑÑ Ð°ÑгÑÐ¼ÐµÐ½Ñ Ð½Ðµ NULL
           ttyname()
           unsetenv()
           wcrtomb() еÑли конеÑнÑй аÑгÑÐ¼ÐµÐ½Ñ NULL
           wcsrtombs() еÑли конеÑнÑй аÑгÑÐ¼ÐµÐ½Ñ NULL
           wcstombs()
           wctomb()

   ÐезопаÑнÑе аÑинÑÑоннÑе оÑменÑемÑе ÑÑнкÑии
       ÐезопаÑÐ½Ð°Ñ Ð°ÑинÑÑÐ¾Ð½Ð½Ð°Ñ Ð¾ÑменÑÐµÐ¼Ð°Ñ ÑÑнкÑиÑ
       (async-cancel-safe function) â ÑÑо ÑÑнкÑиÑ, коÑоÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾
       безопаÑно вÑзÑваÑÑ Ð² пÑиложении, в коÑоÑом
       ÑазÑеÑено аÑинÑÑÐ¾Ð½Ð½Ð°Ñ Ð¾Ñмена (ÑмоÑÑиÑе
       pthread_setcancelstate(3)).

       СоглаÑно POSIX.1-2001 и POSIX.1-2008 ÑолÑко ÑледÑÑÑие
       ÑÑнкÑии Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑнÑми аÑинÑÑоннÑми
       оÑменÑемÑми:

           pthread_cancel()
           pthread_setcancelstate()
           pthread_setcanceltype()

   ТоÑки оÑменÑ
       Ð POSIX.1 опÑеделено, ÑÑо некоÑоÑÑе ÑÑнкÑии
       должнÑ, а неÑколÑко дÑÑÐ³Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð±Ñло
       ÑоÑками оÑменÑ. ÐÑли ниÑÑ Ð¾ÑменÑема, ÐµÑ Ñип
       оÑменÑемоÑÑи оÑкладÑваеÑÑÑ, и ожидаеÑÑÑ
       запÑÐ¾Ñ Ð¾ÑÐ¼ÐµÐ½Ñ Ð½Ð¸Ñи, заÑем ниÑÑ Ð¾ÑменÑеÑÑÑ,
       когда она вÑзÑÐ²Ð°ÐµÑ ÑÑнкÑиÑ, коÑоÑÐ°Ñ ÑвлÑеÑÑÑ
       ÑоÑкой оÑменÑ.

       СледÑÑÑие ÑÑнкÑии Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑоÑками оÑменÑ
       ÑоглаÑно POSIX.1-2001 и/или POSIX.1-2008:

           accept()
           aio_suspend()
           clock_nanosleep()
           close()
           connect()
           creat()
           fcntl() F_SETLKW
           fdatasync()
           fsync()
           getmsg()
           getpmsg()
           lockf() F_LOCK
           mq_receive()
           mq_send()
           mq_timedreceive()
           mq_timedsend()
           msgrcv()
           msgsnd()
           msync()
           nanosleep()
           open()
           openat() [добавлена в POSIX.1-2008]
           pause()
           poll()
           pread()
           pselect()
           pthread_cond_timedwait()
           pthread_cond_wait()
           pthread_join()
           pthread_testcancel()
           putmsg()
           putpmsg()
           pwrite()
           read()
           readv()
           recv()
           recvfrom()
           recvmsg()
           select()
           sem_timedwait()
           sem_wait()
           send()
           sendmsg()
           sendto()
           sigpause() [ÑолÑко POSIX.1-2001 (пеÑемеÑена в ÑпиÑок «можеÑ» в POSIX.1-2008)]
           sigsuspend()
           sigtimedwait()
           sigwait()
           sigwaitinfo()
           sleep()
           system()
           tcdrain()
           usleep() [ÑолÑко POSIX.1-2001 (ÑÑнкÑÐ¸Ñ Ñдалена в POSIX.1-2008)]
           wait()
           waitid()
           waitpid()
           write()
           writev()

       СледÑÑÑие ÑÑнкÑии могÑÑ Ð±ÑÑÑ ÑоÑками оÑменÑ
       ÑоглаÑно POSIX.1-2001 и/или POSIX.1-2008:

           access()
           asctime()
           asctime_r()
           catclose()
           catgets()
           catopen()
           chmod() [добавлена в POSIX.1-2008]
           chown() [добавлена в POSIX.1-2008]
           closedir()
           closelog()
           ctermid()
           ctime()
           ctime_r()
           dbm_close()
           dbm_delete()
           dbm_fetch()
           dbm_nextkey()
           dbm_open()
           dbm_store()
           dlclose()
           dlopen()
           dprintf() [добавлена в POSIX.1-2008]
           endgrent()
           endhostent()
           endnetent()
           endprotoent()
           endpwent()
           endservent()
           endutxent()
           faccessat() [добавлена в POSIX.1-2008]
           fchmod() [добавлена в POSIX.1-2008]
           fchmodat() [добавлена в POSIX.1-2008]
           fchown() [добавлена в POSIX.1-2008]
           fchownat() [Added in POSIX.1-2008]
           fclose()
           fcntl() (Ð´Ð»Ñ Ð»Ñбого знаÑÐµÐ½Ð¸Ñ Ð°ÑгÑменÑа cmd)
           fflush()
           fgetc()
           fgetpos()
           fgets()
           fgetwc()
           fgetws()
           fmtmsg()
           fopen()
           fpathconf()
           fprintf()
           fputc()
           fputs()
           fputwc()
           fputws()
           fread()
           freopen()
           fscanf()
           fseek()
           fseeko()
           fsetpos()
           fstat()
           fstatat() [добавлена в POSIX.1-2008]
           ftell()
           ftello()
           ftw()
           futimens() [добавлена в POSIX.1-2008]
           fwprintf()
           fwrite()
           fwscanf()
           getaddrinfo()
           getc()
           getc_unlocked()
           getchar()
           getchar_unlocked()
           getcwd()
           getdate()
           getdelim() [добавлена в POSIX.1-2008]
           getgrent()
           getgrgid()
           getgrgid_r()
           getgrnam()
           getgrnam_r()
           gethostbyaddr() [ÑолÑко SUSv3 (ÑÑнкÑÐ¸Ñ Ñдалена из POSIX.1-2008)]
           gethostbyname() [ÑолÑко SUSv3 (ÑÑнкÑÐ¸Ñ Ñдалена из POSIX.1-2008)]
           gethostent()
           gethostid()
           gethostname()
           getline() [добавлена в POSIX.1-2008]
           getlogin()
           getlogin_r()
           getnameinfo()
           getnetbyaddr()
           getnetbyname()
           getnetent()
           getopt() (еÑли opterr не Ñавно 0)
           getprotobyname()
           getprotobynumber()
           getprotoent()
           getpwent()
           getpwnam()
           getpwnam_r()
           getpwuid()
           getpwuid_r()
           gets()
           getservbyname()
           getservbyport()
           getservent()
           getutxent()
           getutxid()
           getutxline()
           getwc()
           getwchar()
           getwd() [ÑолÑко SUSv3 (ÑÑнкÑÐ¸Ñ Ñдалена из POSIX.1-2008)]
           glob()
           iconv_close()
           iconv_open()
           ioctl()
           link()
           linkat() [добавлена в POSIX.1-2008]
           lio_listio() [добавлена в POSIX.1-2008]
           localtime()
           localtime_r()
           lockf() [добавлена в POSIX.1-2008]
           lseek()
           lstat()
           mkdir() [добавлена в POSIX.1-2008]
           mkdirat() [добавлена в POSIX.1-2008]
           mkdtemp() [добавлена в POSIX.1-2008]
           mkfifo() [добавлена в POSIX.1-2008]
           mkfifoat() [добавлена в POSIX.1-2008]
           mknod() [добавлена в POSIX.1-2008]
           mknodat() [добавлена в POSIX.1-2008]
           mkstemp()
           mktime()
           nftw()
           opendir()
           openlog()
           pathconf()
           pclose()
           perror()
           popen()
           posix_fadvise()
           posix_fallocate()
           posix_madvise()
           posix_openpt()
           posix_spawn()
           posix_spawnp()
           posix_trace_clear()
           posix_trace_close()
           posix_trace_create()
           posix_trace_create_withlog()
           posix_trace_eventtypelist_getnext_id()
           posix_trace_eventtypelist_rewind()
           posix_trace_flush()
           posix_trace_get_attr()
           posix_trace_get_filter()
           posix_trace_get_status()
           posix_trace_getnext_event()
           posix_trace_open()
           posix_trace_rewind()
           posix_trace_set_filter()
           posix_trace_shutdown()
           posix_trace_timedgetnext_event()
           posix_typed_mem_open()
           printf()
           psiginfo() [добавлена в POSIX.1-2008]
           psignal() [добавлена в POSIX.1-2008]
           pthread_rwlock_rdlock()
           pthread_rwlock_timedrdlock()
           pthread_rwlock_timedwrlock()
           pthread_rwlock_wrlock()
           putc()
           putc_unlocked()
           putchar()
           putchar_unlocked()
           puts()
           pututxline()
           putwc()
           putwchar()
           readdir()
           readdir_r()
           readlink() [добавлена в POSIX.1-2008]
           readlinkat() [добавлена в POSIX.1-2008]
           remove()
           rename()
           renameat() [добавлена в POSIX.1-2008]
           rewind()
           rewinddir()
           scandir() [добавлена в POSIX.1-2008]
           scanf()
           seekdir()
           semop()
           setgrent()
           sethostent()
           setnetent()
           setprotoent()
           setpwent()
           setservent()
           setutxent()
           sigpause() [добавлена в POSIX.1-2008]
           stat()
           strerror()
           strerror_r()
           strftime()
           symlink()
           symlinkat() [добавлена в POSIX.1-2008]
           sync()
           syslog()
           tmpfile()
           tmpnam()
           ttyname()
           ttyname_r()
           tzset()
           ungetc()
           ungetwc()
           unlink()
           unlinkat() [добавлена в POSIX.1-2008]
           utime() [добавлена в POSIX.1-2008]
           utimensat() [добавлена в POSIX.1-2008]
           utimes() [добавлена в POSIX.1-2008]
           vdprintf() [добавлена в POSIX.1-2008]
           vfprintf()
           vfwprintf()
           vprintf()
           vwprintf()
           wcsftime()
           wordexp()
           wprintf()
           wscanf()

       РеализаÑÐ¸Ñ Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð¼ÐµÑаÑÑ Ð´ÑÑгие
       ÑÑнкÑии, не ÑказаннÑе в ÑÑандаÑÑе, как ÑоÑки
       оÑменÑ. Ð ÑаÑÑноÑÑи, ÑеализаÑиÑ, веÑоÑÑно,
       помеÑÐ¸Ñ ÐºÐ°Ðº ÑоÑÐºÑ Ð¾ÑÐ¼ÐµÐ½Ñ Ð»ÑбÑÑ Ð½ÐµÑÑандаÑÑнÑÑ
       ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±Ð»Ð¾ÐºÐ¸ÑоваÑÑÑÑ
       (болÑÑинÑÑво ÑÑнкÑий, ÑабоÑаÑÑÐ¸Ñ Ñ Ñайлами).

   ÐомпилÑÑÐ¸Ñ Ð² Linux
       Ð Linux, пÑогÑаммÑ, иÑполÑзÑÑÑие пÑогÑаммнÑй
       инÑеÑÑÐµÐ¹Ñ pthreads, Ð´Ð¾Ð»Ð¶Ð½Ñ ÐºÐ¾Ð¼Ð¿Ð¸Ð»Ð¸ÑоваÑÑÑÑ Ñ
       помоÑÑÑ cc -pthread.

   РеализаÑии ниÑей POSIX в Linux
       Ðа вÑÑ Ð²ÑÐµÐ¼Ñ Ð² библиоÑеке GNU C бÑло две
       ÑеализаÑии ниÑей Ð´Ð»Ñ Linux:

       LinuxThreads
              ÐеÑвонаÑалÑÐ½Ð°Ñ ÑеализаÑÐ¸Ñ pthreads. ÐаÑинаÑ
              Ñ glibc 2.4 ÑÑа ÑеализаÑÐ¸Ñ Ð±Ð¾Ð»ÑÑе не
              поддеÑживаеÑÑÑ.

       NPTL (библиоÑека ниÑей POSIX)
              СовÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑеализаÑÐ¸Ñ pthreads. Ðо
              ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ LinuxThreads, NPTL более ÑоÑно
              ÑооÑвеÑÑÑвÑÐµÑ ÑÑебованиÑм POSIX.1 и более
              пÑоизводиÑелÑна пÑи Ñоздании болÑÑого
              колиÑеÑÑва ниÑей. NPTL поÑвилаÑÑ Ð² glibc
              наÑÐ¸Ð½Ð°Ñ Ñ Ð²ÐµÑÑии 2.3.2, и ÑÑебÑÐµÑ ÑвойÑÑва,
              поÑвивÑиеÑÑ Ð² ÑдÑе Linux 2.6.

       Ðбе ÑеализаÑии ÑвлÑÑÑÑÑ, Ñак назÑваемÑми
       ÑеализаÑиÑми 1:1, Ñо еÑÑÑ ÐºÐ°Ð¶Ð´Ð°Ñ Ð½Ð¸ÑÑ
       оÑобÑажаеÑÑÑ Ð² планиÑÑемÑй ÑлеменÑа ÑдÑа. Ðбе
       ÑеализаÑии иÑполÑзÑÑÑ ÑиÑÑемнÑй вÑзов Linux
       clone(2). Ð NPTL пÑимиÑÐ¸Ð²Ñ ÑинÑÑонизаÑии ниÑей
       (мÑÑÑекÑÑ, обÑединение ниÑей и Ñ .п.)
       ÑÐµÐ°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑиÑÑемного вÑзова Linux
       futex(2).

   LinuxThreads
       ÐÑлиÑиÑелÑнÑе ÑвойÑÑва данной ÑеализаÑии:

       -  Рдополнении к главной (наÑалÑной) ниÑи,
          ниÑи пÑогÑÐ°Ð¼Ð¼Ñ ÑоздаÑÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ
          pthread_create(3), ÑеализаÑÐ¸Ñ ÑоздаÑÑ Â«ÑпÑавлÑÑÑÑÑ»
          ниÑÑ. ÐÑа ниÑÑ Ð²ÑполнÑÐµÑ Ñоздание и
          завеÑÑение ниÑей (ÑÑо пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº
          пÑоблемам, еÑли ÑÑа ниÑÑ ÑлÑÑайно
          завеÑÑиÑÑÑ).

       -  ÐнÑÑÑи ÑеализаÑии иÑполÑзÑÑÑÑÑ ÑигналÑ. Ð Linux
          2.2 и новее иÑполÑзÑÑÑÑÑ Ð¿ÐµÑвÑе ÑÑи Ñигнала
          ÑеалÑного вÑемени (ÑмоÑÑиÑе Ñакже signal(7)). Ð
          ÑÑаÑÑÑ ÑдÑÐ°Ñ Linux иÑполÑзÑÑÑÑÑ ÑÐ¸Ð³Ð½Ð°Ð»Ñ SIGUSR1 и
          SIGUSR2. РпÑиложениÑÑ Ð½ÐµÐ»ÑÐ·Ñ Ð¸ÑполÑзоваÑÑ
          Ð½Ð°Ð±Ð¾Ñ Ñигналов, задейÑÑвованнÑй в
          ÑеализаÑии.

       -  У ниÑей ÑазнÑе ID пÑоÑеÑÑа (ÑакÑиÑеÑки, ниÑи
          LinuxThreads ÑÐµÐ°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ñ ÐºÐ°Ðº пÑоÑеÑÑÑ, Ñ ÐºÐ¾ÑоÑÑÑ
          болÑÑе обÑей инÑоÑмаÑии Ñем обÑÑно, но
          коÑоÑÑе имеÑÑ ÑазнÑй иденÑиÑикаÑоÑÑ
          пÑоÑеÑÑа). ÐиÑи LinuxThreads (вклÑÑÐ°Ñ ÑпÑавлÑÑÑÑÑ
          ниÑÑ) в ps(1) Ð²Ð¸Ð´Ð¸Ð¼Ñ ÐºÐ°Ðº оÑделÑнÑе пÑоÑеÑÑÑ.

       РеализаÑÐ¸Ñ LinuxThreads оÑклонÑеÑÑÑ Ð¾Ñ
       ÑпеÑиÑикаÑии POSIX.1 в неÑколÑÐºÐ¸Ñ Ð¼ÐµÑÑаÑ, а
       именно:

       -  ÐÑзов getpid(2) возвÑаÑÐ°ÐµÑ ÑазнÑе знаÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ
          каждой ниÑи.

       -  ÐÑзов getppid(2) в ниÑÑÑ, кÑоме главной,
          возвÑаÑÐ°ÐµÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ Ð¿ÑоÑеÑÑа
          ÑпÑавлÑÑÑей ниÑи; вмеÑÑо getppid(2) в ÑÑÐ¸Ñ Ð½Ð¸ÑÑÑ
          бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑÑÑ Ñоже знаÑение, ÑÑо и из
          getppid(2) в главной ниÑи.

       -  Ðогда ниÑÑ ÑоздаÑÑ Ð½Ð¾Ð²Ñй пÑоÑеÑÑ-поÑомок Ñ
          помоÑÑÑ fork(2), вÑе ниÑи Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾Ð¶Ð¸Ð´Ð°ÑÑ
          поÑомка в wait(2). Ðднако ÑеализаÑиÑ
          позволÑÐµÑ Ð²ÑзваÑÑ wait(2) ÑолÑко в ниÑи,
          коÑоÑÐ°Ñ Ñоздала поÑомка.

       -  Ðогда ниÑÑ Ð²ÑзÑÐ²Ð°ÐµÑ execve(2), оÑÑалÑнÑе ниÑи
          завеÑÑаÑÑ ÑабоÑÑ (ÑÑебование POSIX.1). Ðднако,
          полÑÑаемÑй пÑоÑеÑÑ Ð¸Ð¼ÐµÐµÑ ÑÐ¾Ñ Ð¶Ðµ PID, ÑÑо и
          ниÑÑ, коÑоÑÐ°Ñ Ð²Ñзвала execve(2): ÑÑо должен бÑÑÑ
          ÑÐ¾Ñ Ð¶Ðµ PID, ÑÑо и Ñ Ð³Ð»Ð°Ð²Ð½Ð¾Ð¹ ниÑи.

       -  У ниÑей ÑазнÑе ID полÑзоваÑÐµÐ»Ñ Ð¸ гÑÑппÑ. ÐÑо
          Ð¼Ð¾Ð¶ÐµÑ Ð²ÑзваÑÑ ÑложноÑÑи в пÑогÑÐ°Ð¼Ð¼Ð°Ñ Ñ
          set-user-ID и Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к оÑибкам ÑÑнкÑий
          pthreads, еÑли пÑиложение изменÑÐµÑ Ñвои
          ÑÑÑÑнÑе даннÑе Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ seteuid(2) и подобнÑÑ
          вÑзовов.

       -  У ниÑей ÑазнÑе ID ÑеанÑа и гÑÑÐ¿Ð¿Ñ Ð¿ÑоÑеÑÑов.

       -  У ниÑей ÑазнÑе запиÑи о блокиÑовкаÑ,
          ÑозданнÑÑ fcntl(2).

       -  ÐнÑоÑмаÑиÑ, возвÑаÑÐ°ÐµÐ¼Ð°Ñ times(2) и getrusage(2),
          оÑноÑиÑÑÑ ÑолÑко к ниÑи, а не к пÑоÑеÑÑÑ Ð²
          Ñелом.

       -  У ниÑей ÑазнÑе знаÑÐµÐ½Ð¸Ñ Ð¾Ñмен ÑемаÑоÑов
          (ÑмоÑÑиÑе semop(2)).

       -  У ниÑей ÑазнÑе инÑеÑÐ²Ð°Ð»Ñ ÑаймеÑов.

       -  У ниÑей ÑазнÑе знаÑÐµÐ½Ð¸Ñ ÑÑÑÑпÑивоÑÑи.

       -  Ð POSIX.1 ÑазлиÑаÑÑÑÑ ÑигналÑ, адÑеÑованнÑе
          пÑоÑеÑÑÑ Ð² Ñелом и оÑделÑнÑм ниÑÑм.
          СоглаÑно POSIX.1, ÑигналÑ, напÑавленнÑе
          пÑоÑеÑÑÑ (поÑланнÑе, напÑимеÑ, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ
          kill(2)), Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾Ð±ÑабаÑÑваÑÑÑÑ Ð¾Ð´Ð½Ð¾Ð¹
          пÑоизволÑно вÑбÑанной ниÑÑÑ Ð²Ð½ÑÑÑи
          пÑоÑеÑÑа. LinuxThreads не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑигналÑ,
          напÑавленнÑе пÑоÑеÑÑÑ: ÑÐ¸Ð³Ð½Ð°Ð»Ñ Ð¼Ð¾Ð³ÑÑ
          поÑÑлаÑÑÑÑ ÑолÑко опÑеделÑннÑм ниÑÑм.

       -  ÐиÑи имеÑÑ ÑазнÑе наÑÑÑойки
          алÑÑеÑнаÑивного ÑÑека Ñигналов. Ðднако,
          новÑе наÑÑÑойки алÑÑеÑнаÑивного ÑÑека
          Ñигналов копиÑÑÑÑÑÑ Ð¸Ð· ниÑи, коÑоÑÐ°Ñ ÐµÐ³Ð¾
          ÑоздаÑÑ, Ñак ÑÑо изнаÑалÑно ниÑи имеÑÑ
          единÑй алÑÑеÑнаÑивнÑй ÑÑек Ñигналов
          (Ð½Ð¾Ð²Ð°Ñ Ð½Ð¸ÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð° запÑÑкаÑÑÑÑ Ð±ÐµÐ·
          алÑÑеÑнаÑивного ÑÑека Ñигналов. ÐÑли две
          ниÑи обÑабаÑÑваÑÑ ÑÐ¸Ð³Ð½Ð°Ð»Ñ Ð² едином
          алÑÑеÑнаÑивном ÑÑеке Ñигналов
          одновÑеменно, Ñо в пÑогÑамме возникнеÑ
          непÑедÑказÑÐµÐ¼Ð°Ñ Ð¾Ñибка).

   NPTL
       Ð NPTL вÑе ниÑи пÑоÑеÑÑа помеÑаÑÑÑÑ Ð² Ð¾Ð´Ð½Ñ Ð³ÑÑппÑ
       ниÑей; вÑе ÑÐ»ÐµÐ½Ñ Ð³ÑÑÐ¿Ð¿Ñ Ð½Ð¸Ñей имеÑÑ Ð¾Ð´Ð¸Ð½ PID. Ð
       NPTL Ð½ÐµÑ ÑпÑавлÑÑÑей ниÑи.

       ÐнÑÑÑи NPTL иÑполÑзÑÑÑÑÑ Ð¿ÐµÑвÑе два Ñигнала
       ÑеалÑного вÑемени; ÑÑи ÑÐ¸Ð³Ð½Ð°Ð»Ñ Ð½ÐµÐ»ÑзÑ
       иÑполÑзоваÑÑ Ð² пÑиложениÑÑ. ÐодÑобноÑÑи
       ÑмоÑÑиÑе в nptl(7).

       NPTL Ñоже не ÑооÑвеÑÑÑвÑÐµÑ POSIX.1, как минимÑм, в
       одном:

       -  У ниÑей ÑазнÑе знаÑÐµÐ½Ð¸Ñ ÑÑÑÑпÑивоÑÑи.

       ÐеÑколÑко неÑооÑвеÑÑÑвий NPTL пÑоÑвлÑеÑÑÑ
       ÑолÑко пÑи ÑабоÑе Ñо ÑÑаÑÑми ÑдÑами:

       -  ÐнÑоÑмаÑиÑ, возвÑаÑÐ°ÐµÐ¼Ð°Ñ times(2) и getrusage(2),
          оÑноÑиÑÑÑ ÑолÑко к ниÑи, а не к пÑоÑеÑÑÑ Ð²
          Ñелом (иÑпÑавлено в ÑдÑе 2.6.9).

       -  У ниÑей ÑазнÑе огÑаниÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑеÑÑÑÑам
          (иÑпÑавлено в ÑдÑе 2.6.10).

       -  У ниÑей ÑазнÑе инÑеÑÐ²Ð°Ð»Ñ ÑаймеÑов
          (иÑпÑавлено в ÑдÑе 2.6.12).

       -  ТолÑко из главной ниÑи ÑазÑеÑено
          запÑÑкаÑÑ Ð½Ð¾Ð²Ñй ÑÐµÐ°Ð½Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ setsid(2)
          (иÑпÑавлено в веÑÑии 2.6.16).

       -  ТолÑко из главной ниÑи ÑазÑеÑено делаÑÑ
          пÑоÑеÑÑ Ð»Ð¸Ð´ÐµÑом гÑÑÐ¿Ð¿Ñ Ð¿ÑоÑеÑÑов Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ
          setpgid(2) (иÑпÑавлено в веÑÑии 2.6.16).

       -  ÐиÑи имеÑÑ ÑазнÑе наÑÑÑойки
          алÑÑеÑнаÑивного ÑÑека Ñигналов Ðднако,
          новÑе наÑÑÑойки алÑÑеÑнаÑивного ÑÑека
          Ñигналов копиÑÑÑÑÑÑ Ð¸Ð· ниÑи, коÑоÑÐ°Ñ ÐµÐ³Ð¾
          ÑоздаÑÑ, Ñак ÑÑо изнаÑалÑно ниÑи имеÑÑ
          единÑй алÑÑеÑнаÑивнÑй ÑÑек Ñигналов
          (иÑпÑавлено в ÑдÑе 2.6.16).

       Также ÑÑÐ¾Ð¸Ñ ÑÑиÑÑваÑÑ ÑледÑÑÑее о ÑеализаÑии
       NPTL:

       -  ÐÑли мÑгкое огÑаниÑение ÑеÑÑÑÑа на ÑазмеÑ
          ÑÑека (ÑмоÑÑиÑе опиÑание RLIMIT_STACK в setrlimit(2))
          ÑÑÑанавливаеÑÑÑ Ð² знаÑение, оÑлиÑное оÑ
          unlimited, Ñо ÑÑо знаÑение опÑеделÑÐµÑ ÑазмеÑ
          ÑÑека по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ð½Ð¾Ð²ÑÑ Ð½Ð¸Ñей. Ð ÑелÑÑ
          ÑÑÑекÑивноÑÑи, ÑÑо огÑаниÑение должно бÑÑÑ
          ÑÑÑановлено но вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿ÑогÑаммÑ,
          возможно Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð²ÑÑÑоенной командÑ
          оболоÑки ulimit -s (limit stacksize в оболоÑке C).

   ÐпÑеделение ÑеализаÑии ниÑей
       ÐаÑÐ¸Ð½Ð°Ñ Ñ glibc 2.3.2, Ð´Ð»Ñ Ð¾Ð¿Ñеделение
       ÑеализаÑии ниÑей в ÑиÑÑеме можно
       иÑполÑзоваÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ getconf(1), напÑимеÑ:

           bash$ getconf GNU_LIBPTHREAD_VERSION
           NPTL 2.3.4

       ÐÑи налиÑии ÑÑаÑÑÑ Ð²ÐµÑÑий glibc можно
       иÑполÑзоваÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ:

           bash$ $( ldd /bin/ls | grep libc.so | awk '{print $3}' ) | \
                           egrep -i 'threads|nptl'
                   Native POSIX Threads Library by Ulrich Drepper et al

   ÐÑÐ±Ð¾Ñ ÑеализаÑии ниÑей: LD_ASSUME_KERNEL
       Ð ÑиÑÑÐµÐ¼Ð°Ñ Ñ glibc, коÑоÑÐ°Ñ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¸
       LinuxThreads и NPTL (напÑимеÑ, glibc 2.3.x), можно
       воÑполÑзоваÑÑÑÑ Ð¿ÐµÑеменной окÑÑжениÑ
       LD_ASSUME_KERNEL Ð´Ð»Ñ Ð·Ð°Ð¼ÐµÐ½Ñ Ð²ÑбÑанной
       динамиÑеÑким компоновÑиков ÑеализаÑии
       ниÑей по ÑмолÑаниÑ. ÐÑа пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑказÑваеÑ
       динамиÑеÑÐºÐ¾Ð¼Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½Ð¾Ð²ÑÐ¸ÐºÑ ÑÑиÑаÑÑ, ÑÑо он
       запÑÑкаеÑÑÑ Ñ Ð¾Ð¿ÑеделÑнной веÑÑией ÑдÑа в
       ÑиÑÑеме. Указав веÑÑÐ¸Ñ ÑдÑа, в коÑоÑой не
       поддеÑжки, ÑÑебÑемой NPTL, его можно
       заÑÑавиÑÑ Ð¸ÑполÑзоваÑÑ LinuxThreads (наиболее
       веÑоÑÑной пÑиÑиной Ð´Ð»Ñ ÑÑого бÑдеÑ
       необÑодимоÑÑÑ Ð·Ð°Ð¿ÑÑка (Ñломанного)
       пÑиложениÑ, коÑоÑое завиÑÐ¸Ñ Ð¾Ñ Ð½ÐµÐºÐ¾ÑоÑого
       не ÑовмеÑÑимого Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ LinuxThreads). ÐÑимеÑ:

           bash$ $( LD_ASSUME_KERNEL=2.2.5 ldd /bin/ls | grep libc.so | \
                           awk '{print $3}' ) | egrep -i 'threads|nptl'
                   linuxthreads-0.10 by Xavier Leroy

СÐÐТРÐТРТÐÐÐÐ
       clone(2), fork(2), futex(2), gettid(2), proc(5), attributes(7),
       futex(7), nptl(7), sigevent(7), signal(7)

       РазлиÑнÑе ÑпÑавоÑнÑе ÑÑÑаниÑÑ pthreads, напÑимеÑ:
       pthread_attr_init(3), pthread_atfork(3), pthread_cancel(3),
       pthread_cleanup_push(3), pthread_cond_signal(3), pthread_cond_wait(3),
       pthread_create(3), pthread_detach(3), pthread_equal(3),
       pthread_exit(3), pthread_key_create(3), pthread_kill(3),
       pthread_mutex_lock(3), pthread_mutex_unlock(3), pthread_once(3),
       pthread_setcancelstate(3), pthread_setcanceltype(3),
       pthread_setspecific(3), pthread_sigmask(3), pthread_sigqueue(3), и
       pthread_testcancel(3)



Linux                             2015-05-07                       PTHREADS(7)