线程进程的通信

一、前情回顾
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);(将内存清成指定字节)

     字符串首地址,修改成的字符,清几个。

你可能感兴趣的:(算法)