实验三四
- 3._实验三:Linux进程/线程的异步并发执行
- 3.1_fork()函数创建子进程
- 3.2_创建线程
- pthread_create();
- 4._实验四:使用信号量进行互斥与同步
- 4.1_信号量初使用
- (1)信号量简单介绍
- (2)信号量以及P、V操作的使用方法
- (2)利用信号量实现同步互斥
3._实验三:Linux进程/线程的异步并发执行
3.1_fork()函数创建子进程
fork()函数用法解释
个人观点:
#include <unistd.h>
#include <stdio.h>
int main ()
{ pid_t fpid; //fpid表示fork函数返回的值 int count=0; fpid=fork(); if (fpid < 0) printf("error in fork!"); else if (fpid == 0) { printf("i am the child process, my process id is %d/n",getpid()); printf("我是爹的儿子/n");//对某些人来说中文看着更直白。 count++; } else { printf("i am the parent process, my process id is %d/n",getpid()); printf("我是孩子他爹/n"); count++; } printf("统计结果是: %d/n",count); return 0;
}
当执行到代码段fpid=fork(); 时,此时新建了一个子进程,其直观图如下:
练习:
画出流程图
#include <unistd.h>
#include <stdio.h>
int main(){pid_t son_pid,daughter_pid;int count = 1;son_pid = fork();if(son_pid == 0){count++;printf("i am son,count = %d\n",count);}else{daughter_pid = fork();if(daughter_pid == 0){count++;printf("i am daughter, count = %d\n",count);}else{count++;printf("i am father,ID = %d, count = %d\n",daughter_pid,count);waitpid(son_pid,NULL,0);waitpid(daughter_pid,NULL,0);}}
}
3.2_创建线程
pthread.h的使用
pthread_create();
创建两个线程即函数son()和函数daughter();两者执行顺序随机且同步
4._实验四:使用信号量进行互斥与同步
4.1_信号量初使用
(1)信号量简单介绍
Linux提供两种信号量:
内核信号量:用于内核中资源共享控制
用户态信号量:主要包括POSIX信号量和SYSTEM V信号量。其中POSIX信号量分为两类。
无名信号量:主要用于线程间同步,也可用于进程间(由fork产生)同步。
有名信号量:既可用于进程间同步,也可用于线程间同步。
(2)信号量以及P、V操作的使用方法
POSIX有名信号量主要包括:
sem_t* sem_open(const char *name, int oflag, mode_t mode, int value);
//例如:创建一个互斥信号量mutex,初值为1即mutex = 1,访问权限为0666(我也不知道啥意思),
//如信号量存在,则打开之,如不存在,则创建
sem_t* mutex("mutex",O_CREATE,0666,1);
①name: 文件名路径,如’mysem’,会创建/dev/shm/sem.mysem
②oflag:O_CREATE或O_CREATE | O_EXCL
O_CREATE:如信号量存在,则打开之,如不存在,则创建
O_CREATE | O_EXCL:如信号量已存在,则返回error
③mode:信号量访问权限,如0666
④value:信号量初始化值
int sem_wait(sem_t *sem)
测试指定的信号量的值,相当于P操作
若sem > 0,则减1立刻返回;
若sem = 0,则睡眠直到sem > 0,此时立刻减1,然后返回
int sem_post(sem_t *sem)
释放资源,相当于V操作,信号量sem的值加1,唤醒正在等待该信号量的进程/线程
int sem_close(sem_t *sem)
关闭有名信号量
进程中,如果使用完信号量,应使用该函数关闭有名信号量
int sem_unlink(const char *name)
删除系统中的信号量