一、多线程
头文件:
`#include<pthread.h>`
* 1
函数申明:
`int pthread_create(pthread_t*restrict tidp,const pthread_attr_t *restrict_attr,void*(*start_rtn)(void*),void *restrict arg);`
* 1
参数顺次为:
指向线程标识符的指针、设置线程属性、线程运行函数的起始地址、传入参数。
食用方法:
指针函数:
`void *mythread_function(void *arg)
{...}`
* 1
* 2
* 3
* 4
调用代码:
`...
#include <pthread.h>
...
pthread_t mythread;
pthread_create(&mythread, NULL, mythread_function, NULL)`
* 1
* 2
* 3
* 4
* 5
留神:
pthread_create 第 4 个传参为向线程传入参数,但因为只能传入一个,所以传参多的时候须要用 struct 封装一下。
线程创立胜利返回0.
二、信号量
头文件:
`#include <semaphore.h>`
* 1
函数:
初始化信号量
`int sem_init(sem_t *sem, int pshared, unsigned int val);`
* 1
参数顺次为:
信号量指针、信号量类型,信号量初始值。
第二个参数 pshared 为 0 时,该过程内所有线程可用,不为 0 时不同过程间可用。
信号量减 1
`int sem_wait(sem_t *sem);`
* 1
阐明:
该函数申请一个信号量,以后无可用信号量则期待,有可用信号量时占用一个信号量,对信号量的值减 1。
信号量加 1
`int sem_post(sem_t *sem);`
* 1
销毁信号量
`int sem_destory(sem_t *sem);`
* 1
该函数销毁信号量。
三、互斥锁
头文件和线程的雷同:
`#include <pthread.h>`
* 1
应用办法:
创立
形式一:
`pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;`
* 1
形式二:
pthread_mutex_init 函数,函数原型:
`int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t * attr)`
* 1
注:第二个参数为设置互斥锁属性,NULL 示意默认为一般锁。
属性
设置办法:
形式一:
`pthread_mutexattr_init(pthread_mutexattr_t *mattr);`
* 1
形式二:
`pthread_mutexattr_setpshared(pthread_mutexattr_t *mattr, int pshared);`
* 1
形式三:
`pthread_mutexattr_settype(pthread_mutexattr_t *attr , int type)`
* 1
注:第二个参数为设置互斥锁的范畴:能够指定是该过程与其余过程的同步还是同一过程内不同的线程之间的同步。能够设置为 PTHREAD_PROCESS_SHARE 和 PTHREAD_PROCESS_PRIVATE。默认是后者,示意过程内应用锁。
获取锁类型:
`pthread_mutexattr_gettype(pthread_mutexattr_t *attr , int *type)`
* 1
互斥锁的类型:
1.PTHREAD_MUTEX_TIMED_NP,这是缺省值,也就是一般锁。当一个线程加锁当前,其余申请锁的线程将造成一个期待队列,并在解锁后按优先级取得锁。这种锁策略保障了资源分配的公平性。
2.PTHREAD_MUTEX_RECURSIVE_NP,嵌套锁,容许同一个线程对同一个锁胜利取得屡次,并通过屡次 unlock 解锁。如果是不同线程申请,则在加锁线程解锁时从新竞争。
3.PTHREAD_MUTEX_ERRORCHECK_NP,检错锁,如果同一个线程申请同一个锁,则返回 EDEADLK,否则与 PTHREAD_MUTEX_TIMED_NP 类型动作雷同。这样就保障当不容许屡次加锁时不会呈现最简略状况下的死锁。
4.PTHREAD_MUTEX_ADAPTIVE_NP,适应锁,动作最简略的锁类型,仅期待解锁后从新竞争。
锁销毁
`int pthread_mutex_destroy(pthread_mutex_t *mutex);`
* 1
加锁
`int pthread_mutex_lock(pthread_mutex_t *mutex);`
* 1
解锁
`int pthread_mutex_unlock(pthread_mutex_t *mutex);`
* 1
尝试加锁(被占据时返回 EBUSY 而不是挂起期待)
`int pthread_mutex_trylock(pthread_mutex_t *mutex);`
* 1
须要 C /C++ Linux 服务器架构师学习材料加群(973961276)获取(材料包含 C /C++,Linux,golang 技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg 等)