史上最好的pthread Tutorial/Reference
使用
Thread
pthread_t mythread; pthread_create(&mythread, NULL, myfunc, NULL); pthread_join(mythread, NULL);Mutex
1 初始化一个mutex有两种方式, 可以动态的声明:
pthread_mutex_t mymutex pthread_mutex_init(&mymutex, NULL);也可以静态的声明:
pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER;2 使用mutex来serialize一段程序. mutex就好比一把锁,被锁住的程序段(pthread_mutex_lock和pthread_mutex_unlock两个语句间的code)在同一时间只能被一个thread执行. 其他需要执行这段程序的thread都会在pthread_mutex_lock这里被卡住,直到mutex被unlock才能有一个thread接着往下执行.
pthread_mutex_lock (&mymutex); dotstr.sum += mysum; pthread_mutex_unlock (&mymutex);3 销毁一个mutex
pthread_mutex_destroy(&mymutex);
Spinlock
spinlock是轻量级的lock机制,比较mutex等机制,节省了process re-scheduling以及context switch等开销,所以如果确信thread不会被block很久,spinlock会非常有效.
1 申明一个spinlock
pthread_spinlock_t myspinlock; pthread_spin_lock(&myspinlock);2 使用spinlock上锁
pthread_spin_lock(&myspinlock); critialnum += 1; pthread_spin_unlock(&myspinlock);3 销毁
pthread_spin_destroy(&myspinlock);
在MacOS 上, spinlock的原语与linux上的有所不同.
#include <libkern/osatomic.h> OSSpinLock mylock = OS_SPINLOCK_INIT; OSSpinLockLock(&mylock); OSSpinLockUnlock(&mylock);
Misc
Linux上thread的实现和其他UNIX系统有一个重要区别: Linux上pthread_create实际上用一个process来运行一个thread. 所以每个thread都有自己的pid,也有自己的tid.同一个进程中的thread有同样的pid但是不同的tid. 可以用下面的代码查看pid或者tid
fprintf (stderr, "thread pid is %d\n", (int) getpid ()); fprintf (stderr, "thread tid is %d\n", (int) gettid ());
No comments:
Post a Comment