**ریسه‌های پازیکس** (به انگلیسی: POSIX threads) (یا به اختصار **pthreads**) اشاره به تعدادی رابط برنامه‌نویسی نرم‌افزار در استاندارد پازیکس دارد که برای کار با ریسه‌ها در نظر گرفته شده‌اند.در سیستم‌عامل‌های سازگار با این استاندارد مانند فری‌بی‌اس‌دی، اپن‌بی‌اس‌دی، نت‌بی‌اس‌دی، لینوکس، سولاریس و ...، پیاده‌سازی‌های مختلفی از این رابط‌های برنامه‌نویسی وجود دارد. این رابط‌های برنامه‌نویسی در یک فایل سرآیند به نام pthreads.h تعریف شده‌اند. این فایل حاوی تعداد تابع، نوع داده و تعدادی ثوابت است. حدوداً صد عدد روال مختلف برای کار با ریسه‌ها فراهم شده که نام تمام آنها با pthread\_‎ شروع می‌شود. این روال‌ها را می‌توان به چهار دسته تقسیم کرد:

* مدیریت ریسه‌ها - ایجاد، اتصال و ...
* mutex ها
* متغیرهای شرطی
* همگام‌سازی

مثال
----

```
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define NUM\_THREADS 5

void \*TaskCode(void \*argument)
{
 int tid;

 tid = \*((int \*) argument);
 printf("Hello World! It's me, thread %d!\n", tid);

 /\* optionally: insert more useful stuff here \*/

 return NULL;
}

int main(void)
{
 pthread\_t threads[NUM\_THREADS];
 int thread\_args[NUM\_THREADS];
 int rc, i;

 /\* create all threads \*/
 for (i=0; i<NUM\_THREADS; ++i) {
 thread\_args[i] = i;
 printf("In main: creating thread %d\n", i);
 rc = pthread\_create(&threads[i], NULL, TaskCode, (void \*) &thread\_args[i]);
 assert(0 == rc);
 }

 /\* wait for all threads to complete \*/
 for (i=0; i<NUM\_THREADS; ++i) {
 rc = pthread\_join(threads[i], NULL);
 assert(0 == rc);
 }

 exit(EXIT\_SUCCESS);
}

```

این برنامه پنج ریسه ایجاد کرده که هر کدام با صدا زدن تابعی به نام TaskCode شماره منحصربه‌فرد هر ریسه را در خروجی استاندارد چاپ می‌کنند. برای کامپایل این برنامه، کامپایلر باید با پارامتر ‎-pthread فراخوانی شود.

توابع
-----

بیشتر از ۱۰۰ تابع برای کار با ریسه‌ها در نظر گرفته شده است. نوع pthread\_t برای نگه‌داری شماره ID ریسه مورد نظر استفاده می‌شود. نوع pthread\_mutex\_t هم برای برقراری انحصار متقابل و استفاده از mutex ها استفاده می‌شود.

```
int pthread\_create(pthread\_t \*thread, const pthread\_attr\_t \*attr,
 void \*(\*start\_routine)(void \*), void \*arg)

```

این رویه یک ریسه جدید ایجاد می‌کند. thread اشاره‌گری به یک ساختمان pthread\_t است که TID ریسه مورد نظر در آن قرار خواهد گرفت. attr ویژگی‌های ریسه را مشخص می‌کند. برای استفاده از صفات پیشرفض می‌توان به جای آن NULL قرار داد. start\_routine اشاره گر به تابعی است که به محض اجرای شدن ریسه فراخوانی می‌شود. این تابع یک آرگومان void\*‎ دریافت می‌کند و مقدار برگشتی آن هم از همین نوع است. arg آرگومان این تابع را مشخص می‌کند.

```
int pthread\_equal(pthread\_t t1, pthread\_t t2)

```

این تابع ریسه‌های t1 و t2 را با هم مقایسه می‌کند. اگر برابر بودند، یک مقدار غیر صفر برمی‌گردد.

```
void pthread\_exit(void \*value\_ptr)

```

فراخوانی این تابع توسط یک ریسه، باعث می‌شود اجرای آن ریسه خاتمه یابد. value\_ptr مقدار برگشتی ریسه است. این مقدار در تابع pthread\_join در دسترس قرار می‌گیرد.

```
int pthread\_join(pthread\_t thread, void \*\*value\_ptr)

```

فراخوانی این تابع باعث می‌شود تا ریسه فراخوان، منتظر بماند تا threadبه کار خود پایان دهد. وقتی که آن ریسه به کار خود پایان داد، مقدار برگشتی‌اش در value\_ptr قرار می‌گیرد.

```
int pthread\_kill(pthread\_t thread, int sig)

```

این تابع سیگنال sig را به ریسه thread ارسال می‌کند.

```
pthread\_t pthread\_self(void)

```

شماره ID ریسه فراخوان را برمی‌گرداند.

```
void pthread\_yield(void)

```

به زمانبند سیستم اجازه می‌دهد تا ریسه دیگری را برای اجرا شدن انتخاب کند.

```
int pthread\_mutex\_init(pthread\_mutex\_t \*mutex,
 const pthread\_mutexattr\_t \*attr)

```

mutex را برای استفاده کردن آماده می‌کند. قبل از استفاده از mutex، باید این تابع بر روی آن قراخوانی شود. attr صفات آن mutex است. می‌تواند NULL باشد تا از ضفات پیشفرض استفاده شود.

```
int pthread\_mutex\_lock(pthread\_mutex\_t \*mutex)

```

پس از مرحله آماده‌سازی، می‌توان این تابع را بر روی mutex فراخوانی کرد تا mutex قفل شود. این کار دقیقاً قبل از ورود به ناحیه بحرانی و استفاده از منبع مشترک صورت می‌گیرد.

```
int pthread\_mutex\_unlock(pthread\_mutex\_t \*mutex)

```

mutex را باز می‌کند. پس از اینکه ریسه از منبع مشترک استفاده کرد، باید این تابع را بر روی mutex فراخوانی کند تا بقیه ریسه‌ها بتوانند از آن استفاده کنند.

```
int pthread\_mutex\_destroy(pthread\_mutex\_t \*mutex)

```

پس از اتمام کار با mutex باید این تابع روی آن فراخوانی شود تا mutex نابود شود. با نابود شدن mutex، دیگر نمی‌توان از آن استفاده کرد.

برای مطالعه بیشتر
-----------------

* David R. Butenhof. *Programming with POSIX Threads*. Addison-Wesley. ISBN 0-201-63392-2.
* Bradford Nichols, Dick Buttlar, Jacqueline Proulx Farell. *Pthreads Programming*. O'Reilly & Associates. ISBN 1-56592-115-1.`{{cite book}}`: نگهداری یادکرد:نام‌های متعدد:فهرست نویسندگان (link)
* Charles J. Northrup (1996). *Programming with UNIX Threads*. John Wiley & Sons. ISBN 0-471-13751-0.
* Kay A. Robbins and Steven Robbins. *UNIX Systems Programming*. Prentice-Hall. ISBN 0-13-042411-0.

پیوند به بیرون
--------------

* Pthreads Tutorial
* C/C++ Tutorial: using Pthreads
* Article "POSIX threads explained" by دنیل رابینز
* Interview "Ten Questions with David Butenhof about Parallel Programming and POSIX Threads" by Michael Suess
* Open Source POSIX Threads for Win32 بایگانی‌شده در ۲۶ اوت ۲۰۰۸ توسط Wayback Machine
* The Open Group Base Specifications Issue 6, IEEE Std 1003.1
* Pthreads Presentation at 2007 OSCON (O'Reilly Open Source Convention) by Adrien Lamothe. An overview of Pthreads with current trends. بایگانی‌شده در ۲۴ آوریل ۲۰۱۳ توسط Wayback Machine
* Comparing programmability of Open MP and pthreads

منابع
-----

مشارکت‌کنندگان ویکی‌پدیا. «pthreads». در *دانشنامهٔ ویکی‌پدیای انگلیسی*، بازبینی‌شده در ۲۸ ژوئیه ۲۰۱۳.

| * ن
* ب
* و
رایانش موازی |
| --- |
| عمومی | 
* رایانش ابری
* ابررایانه
* خوشه کامپیوتری
* رایانش توزیع‌شده
* رایانش مشبک

 |  |
| سطوح | 
* بیت
* دستوری
* داده
* وظیفه

 |
| ریسه‌ها | 
* Superthreading
* فراریسمانی

 |
| نظریه | 
* قانون امدال
* قانون گوستافسون
* کارایی هزینه
* استاندارد کرپ-فلت
* کاهش‌سرعت
* افزایش‌سرعت

 |
| عناصر | 
* فرآیند
* ریسه
* فیبر
* PRAM
* Instruction window

 |
| هماهنگی | 
* چندپردازشی
* چندریسمانی
* Memory coherency
* انسجام حافظه نهان
* Cache invalidation
* Barrier
* همزمانی
* حالت‌برداری برنامه‌ای

 |
| برنامه‌نویسی | 
* مدل‌ها
	+ موازی‌سازی تلویحی
	+ موازی‌سازی آشکار
	+ هم‌روندی
* طبقه‌بندی فلین
	+ اس‌آی‌اس‌دی
	+ اس‌آی‌ام‌دی
	+ ام‌آی‌اس‌دی
	+ ام‌آی‌ام‌دی
		- اس‌پی‌ام‌دی
* الگوریتم‌های چندریسمانی
* الگوریتم‌های غیرمسدودکننده

 |
| سخت‌افزار | 
* چندپردازشگر
	+ متقارن
	+ نامتقارن
* حافظه
	+ نوما
	+ کوما
	+ توزیع‌شده
	+ مشترک
	+ مشترک توزیع‌شده
* چندریسمانی همزمان
* ام‌پی‌پی
* سوپراسکالر
* پردازنده برداری
* ابررایانه
* *بیوولف*

 |
| رابط‌های برنامه‌نویسی | 
* Ateji PX
* ریسه‌های پازیکس
* OpenMP
* OpenHMPP
* OpenACC
* PVM
* MPI
* UPC
* Intel Threading Building Blocks
* بوست (کتابخانه‌های سی++)
* Global Arrays
* Charm++
* Cilk
* Co-array Fortran
* اپن‌سی‌ال
* کودا
* Dryad

 |
| مشکلات | 
* Embarrassingly parallel
* Software lockout
* مقیاس‌پذیری
* وضعیت رقابتی
* بن‌بست (علوم رایانه)
* بن‌بست
* الگوریتم قطعی
* Parallel slowdown

 |
| 
* **رده**
* **داده**

 |