利用fork()
的特性和break
中断进程处理,子进程在fork()
处进行执行,父进程返回子进程的pid,子进程返回0;同时父进程有一个统计子进程数量的num变量,防止生产者子进程创建后续的进程,详情参照代码。
一个特殊说明:这里仅仅是一个代码说明的例子,实际的生产者消费者模型大多是基于共享内存的。
代码实例:
#include <stdio.h>
#include <wait.h>
#include <unistd.h>
const int proNum = 3; // 生产者数目
const int conNum = 2; // 消费者数目
int main() {
int status = -1;
int num = 0; // 任意线程创建子线程的数目
// 创建生产者线程
for (int i = 0; i < proNum; ++i) {
status = fork();
if (status == 0 || status == -1) {
break; // 子进程会在这里break
} else {
++num; // 父进程统计当前子进程的个数
}
}
// 创建消费者线程
for (int i = 0; i < conNum; ++i) {
if (status == 0) { // 生产者线程num一直小于proNum
break;
} else {
status = fork(); // 这里是父进程的fork()函数
++num;
}
}
if (status == -1) {
perror("fork() error\n");
return 1;
} else if (status == 0 && num < proNum) { // 生产者线程
puts("child pro");
} else if (status == 0 && num >= proNum) { // 消费者线程
puts("child con");
} else { // 父进程
wait(NULL);
puts("parent");
}
return 0;
}
可能的输出结果:
child pro
child pro
child con
parent
child pro
child con