快给我进来看linux操作系统下C语言多线程同步使用指南

码农天地 -
快给我进来看linux操作系统下C语言多线程同步使用指南

一、多线程
头文件:

`#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等)

特别申明:本文内容来源网络,版权归原作者所有,如有侵权请立即与我们联系(cy198701067573@163.com),我们将及时处理。

Tags 标签

加个好友,技术交流

1628738909466805.jpg