实例学习进程线程编程
上一篇博客感觉上就像一篇流水帐,就连本人都不知道自己在写些什么,,这篇博客将用三个实例说明linux进程和线程编程.
1、实验一:创建进程 说明:由父进程创建子进程,让子进程读取一个文件,父进程等待子进程读完文件后继续执行 解决方案:用waitpid()函数协调两个进程. 源码: #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/wait.h> #include<sys/types.h>
void rawF(char *fileName){ FILE* fp = fopen(fileName, "r"); if(fp == NULL){ printf("Error!\n"); exit(1); }else{ char c; while((c = getc(fp)) != EOF){ putc(c, stdout); } } }
int main(){ /*创建子进程*/ int p_id = fork(); if(p_id == -1){/*创建失败*/ printf("创建子进程失败"); exit(-1); } else if(p_id == 0){/*子进程*/ printf("This is child process with pid of %d\n", getpid()); /*读取一个文件并打印屏幕*/ rawF("test.txt"); } else{/*父进程*/ pid_t p = wait(NULL);/*等待子进程结束*/ printf("child process with pid %d is over.\n", p); } }
2、实验二:线程共享进程中的数据 说明:创建一个线程,在线程中更改进程中的数据 解决方案:在进程中定义共享数据,在线程中直接引用并输出该数据 源码: #include<stdio.h> #include<pthread.h>
static int sharedata = 4; void *create(void* arg){ printf("new thread...\n"); printf("shared data = %d\n", sharedata); sharedata = 8; return (void*)0; }
int main(){ /*用thread_create()创建新进程*/ pthread_t tidp; int error = pthread_create(&tidp, NULL, create, NULL); if(error != 0){//创建失败 printf("pthread_create is not create ..."); return -1; } sleep(1);/*等待一段时间*/ printf("pthread_create is create...\n"); printf("shared data = %d\n", sharedata); return 0; } 注意:编译选项为gcc -Wall -lpthread a.c,pthread库不是Linux系统的库.
3、多线程单词统计 说明:两个文件,两个线程,统计两个文件共有多少单词 解决方案:利用互斥锁修改临界资源,确保线程间的同步与协作 源码: #include<stdio.h> #include<pthread.h> #include<pthread.h>
pthread_mutex_t counter = PTHREAD_MUTEX_INITIALIZER; int total_words = 0;
void *count_words(void *f){ char* filename = (char*)f; FILE* fp; int c, prevc = ''\0'';
if((fp = fopen(filename, "r")) != NULL){ while((c = getc(fp)) != EOF){ if(!isalnum(c) && isalnum(prevc)){ pthread_mutex_lock(&counter); total_words ; pthread_mutex_unlock(&counter); } prevc = c; } fclose(fp); }else{ printf("ERROR!"); } return 0; }
int main(int argc, char** argv){ if(argc != 3){ printf("Usage:%s file1 file2\n", argv[0]); exit(1); } /*以argv[1]和argv[2]作为参数,创建两个线程*/ pthread_t tidp1, tidp2; int error1, error2; error1 = pthread_create(&tidp1, NULL, count_words, argv[1]); error2 = pthread_create(&tidp2, NULL, count_words, argv[2]); if((error1 != |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |