• pthread


    代码:

    #include  <stdio.h>
    #include  <stdlib.h>
    #include  <pthread.h>
    #include  <ctype.h>
    
    struct arg_set {
    		char *fname;
    		int  count;
    };
    
    struct arg_set  *mailbox = NULL;
    pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
    pthread_cond_t  flag = PTHREAD_COND_INITIALIZER;
    
    void *count_words(void *);
    int main(int argc, char *argv[])
    {
    	pthread_t t1, t2;
    	struct arg_set args1, args2;	
    	int reports_in = 0;
    	int	total_words = 0;
    
    	if ( argc != 3 ){
    		printf("usage: %s file1 file2\n", argv[0]);
    		exit(1);
    	}
    
    	args1.fname = argv[1];
    	args1.count = 0;
    	pthread_create(&t1, NULL, count_words, (void *) &args1);
    
    	args2.fname = argv[2];
    	args2.count = 0;
    	pthread_create(&t2, NULL, count_words, (void *) &args2);
    
    	pthread_mutex_lock(&lock);
    	while( reports_in < 2 ){
    		printf("MAIN: waiting for flag to go up\n");
    		pthread_cond_wait(&flag, &lock); 
    		printf("MAIN: Wow! flag was raised, I have the lock\n");
    		printf("%7d: %s\n", mailbox->count, mailbox->fname);
    		total_words += mailbox->count;
    		if ( mailbox == &args1) 
    			pthread_join(t1,NULL);
    		if ( mailbox == &args2) 
    			pthread_join(t2,NULL);
    		mailbox = NULL;
    		pthread_cond_signal(&flag);	
    		reports_in++;
    	}
    	pthread_mutex_unlock(&lock);
    	
    	printf("%7d: total words\n", total_words);
    }
    void *count_words(void *a)
    {
    	struct arg_set *args = a;
    	FILE *fp;
    	int  c, prevc = '\0';
    	
    	if ( (fp = fopen(args->fname, "r")) != NULL ){
    		while( ( c = getc(fp)) != EOF ){
    			if ( !isalnum(c) && isalnum(prevc) )
    				args->count++;
    			prevc = c;
    		}
    		fclose(fp);
    	} else 
    		perror(args->fname);
    	printf("COUNT: waiting to get lock\n");
    	pthread_mutex_lock(&lock);	
    	printf("COUNT: have lock, storing data\n");
    	if ( mailbox != NULL ){
    		printf("COUNT: oops..mailbox not empty. wait for signal\n");
    		pthread_cond_wait(&flag,&lock);
    	}
    	mailbox = args;			
    	printf("COUNT: raising flag\n");
    	pthread_cond_signal(&flag);	
    	printf("COUNT: unlocking box\n");
    	pthread_mutex_unlock(&lock);	
    	return NULL;
    }
    

    截图:



    程序功能:
    通过thread互斥来查看两个文件中字符串的数量,第一个tzy.txt文件先获得锁,第二个1327.txt文件则需要等待,当第一个完成之后再进行第二个文件的统计操作,最后输出总结果。

  • 相关阅读:
    钩子函数和回调函数的区别
    观察者模式(Observer)和发布-订阅者模式(Publish/Subscribe)区别
    前端解决跨域问题的终极武器——Nginx反向代理
    CORS(cross-origin-resource-sharing)跨源资源共享
    Vue父子组件通讯
    js的变量——基本类型保存在栈中,引用类型保存在堆中
    python
    CentOS7 下 Zabbix3.4 源码安装
    linux配置ssh公钥认证,打通root用户的免密码输入的scp通道
    python
  • 原文地址:https://www.cnblogs.com/tzy20191327/p/15555305.html
Copyright © 2020-2023  润新知