• thread互斥测试


    编译运行附件中的代码,并说明程序的功能
    根据自己的理解,提交不少于3张图片

     

    #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
    ", 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
    ");
    		pthread_cond_wait(&flag, &lock); //令线程等待在条件变量上
    		printf("MAIN: Wow! flag was raised, I have the lock
    ");
    		printf("%7d: %s
    ", mailbox->count, mailbox->fname);
    		total_words += mailbox->count;
    		if ( mailbox == &args1) 
    			pthread_join(t1,NULL);//等待线程t1执行结束
    		if ( mailbox == &args2) 
    			pthread_join(t2,NULL);//等待线程t2执行结束
    		mailbox = NULL;
    		pthread_cond_signal(&flag);	//通知等待在条件变量上的线程
    		reports_in++;
    	}
    	pthread_mutex_unlock(&lock);//释放互斥锁
    	
    	printf("%7d: total words
    ", total_words);
    }
    void *count_words(void *a)
    {
    	struct arg_set *args = a;
    	FILE *fp;
    	int  c, prevc = '';
    	
    	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
    ");
    	pthread_mutex_lock(&lock);//拿到互斥锁,进入临界区	
    	printf("COUNT: have lock, storing data
    ");
    	if ( mailbox != NULL ){
    		printf("COUNT: oops..mailbox not empty. wait for signal
    ");
    		pthread_cond_wait(&flag,&lock);
    	}
    	mailbox = args;			
    	printf("COUNT: raising flag
    ");
    	pthread_cond_signal(&flag);	//通知等在条件变量上的线程
    	printf("COUNT: unlocking box
    ");
    	pthread_mutex_unlock(&lock);	
    	return NULL;
    }
    

      

  • 相关阅读:
    ProxySQL结构
    Kubernetes 零宕机滚动更新
    Promtail Pipeline 日志处理配置
    Fluentd 简明教程
    innodb_flush_log_at_trx_commit 和 sync_binlog 参数详 解
    AlertManager 何时报警
    ProxySQL 全局变量详解
    ProxySQL SQL 注入引擎
    ProxySQL SSL 配置
    ProxySQL 密码管理
  • 原文地址:https://www.cnblogs.com/cindy123456/p/14028529.html
Copyright © 2020-2023  润新知