一、前情回顾
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 mutex:锁对象地址
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);(将内存清成指定字节)
字符串首地址,修改成的字符,清几个。