pthread_create
头文件 :
#include
函数定义:
int pthread_create(pthread_t * thread,const pthread_attr_t * attr,
void *(* start_routine)(void *),void * arg);
来自< http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_create.html >
描述 :
它的功能是创建线程(实际上就是确定调用该线程函数的入口点),在线程创建以后,就开始运行相关的线程函数。
参数 :
一个第参数为指向线程标识符的指针。
第二个参数用来设置线程属性。
第三个参数是线程运行函数的起始地址。
最后一个参数是运行函数的参数。
pthread_create(&mThread,NULL,thread_main,this)
返回值 :
返回成功时,由tidp指向的内存单元被设置为新创建线程的线程ID.attr参数用于指定各种不同的线程属性。新创建的线程从start_rtn函数的地址开始运行,函数该只有一个万能指针参数精氨酸,如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为阿根廷的参数传入。
若线程创建成功,则返回0。若线程创建失败,则返回出错编号,并且*线程中的内容是未定义的。
来自< https://baike.baidu.com/item/pthread_create/5139072?fr=aladdin >
pthread_join
函数pthread_join用来等待一个线程的结束,线程间同步的操作。
头文件 :
#include
函数定义:
int pthread_join(pthread_t thread, void **value_ptr);
描述 :
pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果线程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的。value_ptr可以用来存储被等待线程的返回值。一个线程不能被多个线程等待。
参数 :
thread: 线程标识符,即线程ID,标识唯一线程。value_ptr: 用户定义的指针,用来存储被等待线程的返回值,可以为NULL。
返回值 :
如果成功,则pthread_join()函数返回零。 否则,返回错误号以指示错误。
初始化/销毁互斥锁
头文件 :
#include <pthread.h>
函数定义:
int pthread_mutex_init(pthread_mutex_t *mutex,
const pthread_mutexattr_t *attr);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
来自
描述 :
pthread_mutex_init()函数使用attr指定的属性初始化互斥锁引用的互斥锁。如果attr为NULL,则使用默认的互斥锁属性;效果与传递默认互斥锁属性对象的地址相同。初始化成功后,互斥锁的状态将初始化并解锁。
尝试初始化已初始化的互斥锁会导致未定义的行为。
pthread_mutex_destroy()函数销毁互斥锁引用的互斥锁对象;实际上,互斥对象变得未初始化。实现可能会导致pthread_mutex_destroy()将互斥引用的对象设置为无效值。可以使用pthread_mutex_init()重新初始化被破坏的互斥对象;在对象被销毁之后引用该对象的结果是未定义的。
销毁已解锁的初始化互斥锁是安全的。试图销毁锁定的互斥锁会导致未定义的行为。
在默认互斥锁属性适当的情况下,宏PTHREAD_MUTEX_INITIALIZER可用于初始化静态分配的互斥锁。通过调用pthread_mutex_init()并将参数attr指定为NULL,除了不执行错误检查之外,该效果等效于动态初始化。
参数 :
pthread_mutexattr_t 用于标识互斥锁属性对象。
pthread_mutex_t 用于互斥。
返回值 :
如果成功,则pthread_mutex_init()和pthread_mutex_destroy()函数返回零。 否则,返回错误号以指示错误。 如果实现了[EBUSY]和[EINVAL]错误检查,就好像它们是在函数处理开始时立即执行的,并在修改互斥锁指定的互斥锁状态之前导致错误返回。
初始化/销毁互斥锁属性对象
头文件 :
#include <pthread.h>
函数定义:
int pthread_mutexattr_init(pthread_mutexattr_t *attr);
int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
描述 :
函数pthread_mutexattr_init()使用实现定义的所有属性的默认值初始化互斥锁属性对象attr。
在使用互斥锁属性对象初始化一个或多个互斥锁之后,任何影响属性对象的函数(包括破坏)都不会影响任何先前初始化的互斥锁。
pthread_mutexattr_destroy()函数会破坏互斥锁属性对象; 实际上,对象变得未初始化。 实现可能会导致pthread_mutexattr_destroy()将attr引用的对象设置为无效值。 可以使用pthread_mutexattr_init()重新初始化已销毁的互斥锁属性对象; 在对象被销毁之后引用该对象的结果是未定义的。
http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_mutexattr_init.html
参数 :
返回值 :
成功完成后,pthread_mutexattr_init()和pthread_mutexattr_destroy()将返回零。 否则,返回错误号以指示错误。
上锁/解锁互斥锁
头文件 :
#include <pthread.h>
函数定义:
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
描述 :
如果互斥锁类型为PTHREAD_MUTEX_NORMAL,则不提供死锁检测。尝试重新锁定互斥锁会导致死锁。如果某个线程尝试解锁未锁定的互斥锁或解锁的互斥锁,则会导致未定义的行为。
如果互斥锁类型为PTHREAD_MUTEX_ERRORCHECK,则提供错误检查。如果某个线程尝试重新锁定已锁定的互斥锁,则会返回错误。如果某个线程尝试解锁未锁定的互斥锁或解锁的互斥锁,则会返回错误。
如果互斥锁类型为PTHREAD_MUTEX_RECURSIVE,则互斥锁保持锁定计数的概念。当线程第一次成功获取互斥锁时,锁定计数设置为1。每次线程重新锁定此互斥锁时,锁定计数都会增加1。每次线程解锁互斥锁时,锁定计数减1。当锁定计数达到零时,互斥锁可供其他线程获取。如果某个线程尝试解锁未锁定的互斥锁或解锁的互斥锁,则会返回错误。
如果互斥锁类型为PTHREAD_MUTEX_DEFAULT,则尝试递归锁定互斥锁会导致未定义的行为。如果未通过调用线程锁定互斥锁,则尝试解锁互斥锁会导致未定义的行为。如果未锁定互斥锁,则尝试解锁互斥锁会导致未定义的行为。
函数pthread_mutex_trylock()与pthread_mutex_lock()完全相同,只是如果mutex引用的互斥对象当前被锁定(由任何线程,包括当前线程),则调用立即返回。
pthread_mutex_unlock()函数释放互斥锁引用的互斥锁对象。释放互斥锁的方式取决于互斥锁的类型属性。如果调用pthread_mutex_unlock()时互斥引用的互斥锁对象上存在线程阻塞,导致互斥锁变为可用,则调度策略用于确定哪个线程将获取互斥锁。 (对于PTHREAD_MUTEX_RECURSIVE互斥锁,当计数达到零并且调用线程不再对此互斥锁有任何锁定时,互斥锁变为可用)。
如果将信号传递给等待互斥锁的线程,则从信号处理程序返回后,线程将继续等待互斥锁,就像它没有被中断一样。
参数 :
#include
pthread_mutex_t Used for mutexes.
返回值 :
如果成功,则pthread_mutex_lock()和pthread_mutex_unlock()函数返回零。 否则,返回错误号以指示错误。
如果获取了互斥锁引用的互斥锁对象上的锁,则函数pthread_mutex_trylock()将返回零。 否则,返回错误号以指示错误。
设置/获取互斥锁范围
头文件 :
#include <pthread.h>
函数定义:
int pthread_mutexattr_getpshared(const pthread_mutexattr_t *attr,
int *pshared);
int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr,
int pshared);
来自
描述 :
函数pthread_mutexattr_setpshared和函数pthread_mutexattr_settype用来设置互斥锁属性。前一个函数设置属性pshared,它有两个取值,PTHREAD_PROCESS_PRIVATE和PTHREAD_PROCESS_SHARED。前者用来不同进程中的线程同步,后者用于同步本进程的不同线程。
pthread_mutexattr_getpshared()函数从attr引用的attributes对象获取process-shared属性的值。
pthread_mutexattr_setpshared()函数用于在attr引用的初始化属性对象中设置process-shared属性。
process-shared属性设置为PTHREAD_PROCESS_SHARED,以允许任何可以访问分配互斥锁的内存的线程对互斥锁进行操作,即使互斥锁是在多个进程共享的内存中分配的。 如果process-shared属性为PTHREAD_PROCESS_PRIVATE,则互斥锁将仅由与初始化互斥锁的线程在同一进程中创建的线程进行操作; 如果不同进程的线程试图在这样的互斥锁上运行,则行为是不确定的。 该属性的默认值为PTHREAD_PROCESS_PRIVATE。
参数 :
pthread_mutexattr_t 用于标识互斥锁属性对象。
返回值 :
成功完成后,pthread_mutexattr_setpshared()将返回零,否则,返回错误号以指示错误。
成功完成后,pthread_mutexattr_getpshared()将返回零,并将attr的process-shared属性的值存储到pshared参数引用的对象中。 否则,返回错误号以指示错误。
设置/获取互斥锁类型属性
头文件 :
#include
函数定义:
int pthread_mutexattr_gettype(const pthread_mutexattr_t *attr, int *type);
int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type);
描述 :
pthread_mutexattr_gettype()和pthread_mutexattr_settype()函数分别获取和设置互斥锁类型属性。此属性在这些函数的type参数中设置。 type属性的默认值为PTHREAD_MUTEX_DEFAULT。
互斥锁的类型包含在互斥锁属性的type属性中。有效的互斥锁类型包括:
PTHREAD_MUTEX_NORMAL
这种类型的互斥锁不会检测到死锁。试图在没有首先解锁它的情况下重新锁定此互斥锁的线程将会死锁。尝试解锁由不同线程锁定的互斥锁会导致未定义的行为。尝试解锁未锁定的互斥锁会导致未定义的行为。
PTHREAD_MUTEX_ERRORCHECK
这种类型的互斥锁提供错误检查。尝试重新锁定此互斥锁而不先解锁它的线程将返回错误。尝试解锁另一个线程已锁定的互斥锁的线程将返回错误。尝试解锁未锁定互斥锁的线程将返回错误。
PTHREAD_MUTEX_RECURSIVE
尝试重新锁定此互斥锁而不先解锁它的线程将成功锁定互斥锁。此类型的互斥锁不会发生使用PTHREAD_MUTEX_NORMAL类型的互斥锁可能发生的重新锁定死锁。此互斥锁的多个锁需要相同数量的解锁才能释放互斥锁,然后另一个线程才能获取互斥锁。尝试解锁另一个线程已锁定的互斥锁的线程将返回错误。尝试解锁未锁定互斥锁的线程将返回错误。
PTHREAD_MUTEX_DEFAULT
尝试递归锁定此类型的互斥锁会导致未定义的行为。尝试解锁未被调用线程锁定的此类型的互斥锁会导致未定义的行为。尝试解锁未锁定的此类型的互斥锁会导致未定义的行为。允许实现将此互斥锁映射到其他互斥锁类型之一。
参数 :
返回值 :
如果成功,则pthread_mutexattr_settype()函数返回零。 否则,返回错误号以指示错误