一、前情回顾
void perror(const char *s); |
功能: |
参数: |
二、资源竞争
1.多线程访问临界资源时存在资源竞争(存在资源竞争、造成数据错乱)
临界资源:多个线程可以同时操作的资源空间(全局变量、共享内存)
解决:
互斥:多个线程访问临界资源时,进行排他性访问。(同一时刻只允许一个线程对该临界资源进行访问)
互斥锁:解决多线程访问临界资源时,存在资源竞争。
1.创建 pthread_mutex_t mutex
2.初始化 pthread_mutex_init
3.加锁 int pthread_mutex_lock
4.解锁 int pthread_mutex_unlock
5.销毁锁 int pthread_mutex_destroy
int pthread_mutex_init(pthread_mutex_t *restrict muxt,const pthread_mutexattr_t *restrict attr); |
功能:初始化一个互斥锁 |
参数: restrict attr:锁的属性(NULL) |
返回值: 成功:0 失败:非零 |
上锁 int pthread_mutex_lock( pthreaad_mutex_t *mutex) |
解锁 int pthread_mutex_unlock( pthreaad_mutex_t *mutex) |
销毁锁 int pthread_mutex_destroy( pthreaad_mutex_t *mutex) |
参数:所创建的锁地址 |
返回值: 成功:0 失败:非零 |
2.同步与异步
异步:多任务各自执行各自的任务,互相之间没有直接干扰。
同步:多个任务中的某些步骤按照先后顺序执行。
2.1线程间同步:
多个线程在某个任务执行过程中具有先后顺序
2.1.1信号量(sem):
实现线程间同步(使用同步方式访问临界资源,可以达到互斥的效果)
2.1.2信号量使用:
1.定义信号量对像 sem_t sem
2.初始化 sem_init()
3.申请信号量:P操作
4.释放信号量:V操作
5.销毁
int sem_init(sem_t *sem,int pshared,unsigned int value) |
功能:初始化一个信号量 |
参数: sem:信号量的地址 pshared:同一个进程间的线程间 0//不同进程间非0 value:初始化的资源数 |
返回值: 成功 0 失败 -1 |
申请 | int sem_wait( sem_t *sem) |
当申请的信号量资源数>0,sem_wait表示申请到了该信号量,信号量资源数-1) | |
当申请的信号量资源数=0,sem_wait阻塞等待信号量的释放 | |
释放 | int sem_post( sem_t *sem) |
该信号量的资源数自动+1 | |
销毁 | int sem_destroy( sem_t *sem) |
三、进程通信
同一主机进程间通信:
3.1无名管道
用于同一主机下,具有亲缘关系的进程间通信。
1.创建一个管道并打开 int pipe(int pipefd[2]);(pipefd[0],管道的读端,pipefd[1]管道的写端)
2.读管道 read();
3.写管道 write();
4.关闭管道 close();
5.删除管道 remove();
3.2有名管道
用于同一主机下,具有任意关系的进程间通信。
3.3信号
3.4共享队列
3.5消息队列
3.6信号灯
不同主机进程间通信:
3.7网络套接字
四、补充
*memset(void *s,int c,size_t n);(将内存清成指定字节)
字符串首地址,修改成的字符,清几个