c语言多进程(linux简单的C语言程序,多进程,为什么存在死循环的时候不打印字符死循环明明在打印语句的后面呀)
本文目录
linux简单的C语言程序,多进程,为什么存在死循环的时候不打印字符死循环明明在打印语句的后面呀
流来不及刷新,不是你打印就立刻出现再终端的,它需要一个刷新过程,而你的死循环让它没有时间刷新
c语言多进程问题
在开子进程之前分配了空间(应该指的malloc()函数吧),用p指向了它,那么在子进程里调用 free() 会将子进程中的那一片空间释放掉。 但父进程中的这片空间要在父进程里调用 free() 函数将其释放。 否则会造成内在泄漏。 而且不能在父子两个进程的公共区域调用 free() 函数,如果在公共区域内调用会造成 "double free" 这个运行时错误
在linux下用c语言实现用多进程同步方法演示“生产者-消费者”问题
这个问题需要的知识主要包括:
1 多进程间进行通信;
2 使用同步信号量(semaphore)和互斥信号量(mutex)进行数据保护。
参考代码如下,可以参照注释辅助理解:
#include 《stdio.h》#include 《stdlib.h》#include 《unistd.h》#include 《pthread.h》#include 《semaphore.h》#define N 2 // 消费者或者生产者的数目#define M 10 // 缓冲数目int in = 0; // 生产者放置产品的位置int out = 0; // 消费者取产品的位置int buff = {0}; // 缓冲初始化为0, 开始时没有产品sem_t empty_sem; // 同步信号量, 当满了时阻止生产者放产品sem_t full_sem; // 同步信号量, 当没产品时阻止消费者消费pthread_mutex_t mutex; // 互斥信号量, 一次只有一个线程访问缓冲int product_id = 0; //生产者idint prochase_id = 0; //消费者id/* 打印缓冲情况 */void print(){int i;for(i = 0; i 《 M; i++) printf("%d ", buff);printf("\n");}/* 生产者方法 */ void *product(){int id = ++product_id;while(1){ // 用sleep的数量可以调节生产和消费的速度,便于观察 sleep(1); //sleep(1); sem_wait(&empty_sem); pthread_mutex_lock(&mutex); in = in % M; printf("product%d in %d. like: \t", id, in); buff = 1; print(); ++in; pthread_mutex_unlock(&mutex); sem_post(&full_sem); }}/* 消费者方法 */void *prochase(){int id = ++prochase_id;while(1){ // 用sleep的数量可以调节生产和消费的速度,便于观察 sleep(1);//sleep(1); sem_wait(&full_sem); pthread_mutex_lock(&mutex); out = out % M; printf("prochase%d in %d. like: \t", id, out); buff = 0; print(); ++out; pthread_mutex_unlock(&mutex); sem_post(&empty_sem);}}int main(){pthread_t id1;pthread_t id2;int i;int ret;// 初始化同步信号量int ini1 = sem_init(&empty_sem, 0, M); int ini2 = sem_init(&full_sem, 0, 0); if(ini1 && ini2 != 0){ printf("sem init failed \n"); exit(1);} //初始化互斥信号量 int ini3 = pthread_mutex_init(&mutex, NULL);if(ini3 != 0){ printf("mutex init failed \n"); exit(1);} // 创建N个生产者线程for(i = 0; i 《 N; i++){ ret, NULL, product, (void *)(&i)); if(ret != 0) { printf("product%d creation failed \n", i); exit(1); }}//创建N个消费者线程for(i = 0; i 《 N; i++){ ret, NULL, prochase, NULL); if(ret != 0) { printf("prochase%d creation failed \n", i); exit(1); }}//销毁线程for(i = 0; i 《 N; i++){ pthread_join(id1,NULL); pthread_join(id2,NULL);}exit(0); }
在Linux下编译的时候,要在编译命令中加入选项-lpthread以包含多线程支持。比如存储的C文件为demo.c,要生成的可执行文件为demo。可以使用命令:
gcc demo.c -o demo -lpthread
程序中为便于观察,使用了sleep(1);来暂停运行,所以查看输出的时候可以看到,输出是每秒打印一次的。
更多文章:
5 0 1固件下载(91下载的ios5.0.1固件如何升级安装到iphone4呀,iphone 的版本是4.3.5)
2024年5月5日 06:45
win10最新版本是多少(win10用版本微信最新版本是多少)
2024年5月20日 01:59
如何评价判断抖音SEO优化与常规SEO优化的相同与不同?抖音seo优化
2024年6月28日 04:19
小鸡模拟器ios(ios苹果小鸡模拟器除了psp以外都闪退)
2024年6月22日 05:22
会声会影x7下载(为什么Win764位系统装不了会声会影X7)
2024年5月30日 06:37