对一个多线程代码的解读


#include<stdlib.h> 
#include<stdio.h> 
#include<unistd.h> 
#include<pthread.h> 
// typedef 相当于宏,可以让定义的变量脱离平台的限制
// 在typedef char* PCHAR 的时候 PCAHR pa,pb可以将pa,pb都定义成指针,也就是将 char * 变成了真正的数据类型
typedef struct ct_sum{ int sum;  
	//声明一个互斥锁
	pthread_mutex_t lock;  
}ct_sum;  
void * add1(void *cnt)  {       
	//将互斥锁进行上锁
	pthread_mutex_lock(&(((ct_sum*)cnt)->lock));  
	for(int i = 0; i < 10; i++){ 		
            printf("%d\n" , i); 		
            (*(ct_sum*)cnt).sum+=i;   	
        }   	
        //解除互斥锁 	
        pthread_mutex_unlock(&(((ct_sum*)cnt)->lock));  
	pthread_exit(NULL);  
	return 0;  
}  
void * add2(void *cnt){       
	cnt = (ct_sum*)cnt;  
	pthread_mutex_lock(&(((ct_sum*)cnt)->lock));  
	for(int i = 50; i < 60; i++) {
      		printf("%d\n" , i);
  		(*(ct_sum*)cnt).sum+=i;
   	}
   	pthread_mutex_unlock(&(((ct_sum*)cnt)->lock));  
	pthread_exit(NULL);  
	return 0;  
}  


int main(void)  { 
	//声明两个线程
	pthread_t ptid1,ptid2;  
	ct_sum cnt;  
	//对互斥锁进行初始化
	pthread_mutex_init(&(cnt.lock),NULL);  
	cnt.sum=0;  

	//绑定线程和对应的执行函数
	pthread_create(&ptid1,NULL,add1,&cnt);  
	pthread_create(&ptid2,NULL,add2,&cnt);  
	//这里的执行顺序,通常在第一个和第二个之间,从来没有出现第三个执行的情况,为什么呢?
	//如果放在create 之前,就永远是第一个执行,add1和add2的顺序不确定
	//如果放在join之间,则出现在第二,第三个执行,从未第一个
	//放在join之后,则永远出现在第三个执行,

	pthread_join(ptid2,NULL);  
	pthread_mutex_lock(&(cnt.lock));  
	printf("sum %d\n",cnt.sum);  
	pthread_mutex_unlock(&(cnt.lock));  

	//回收现成的资源
	//用来等待一个线程的结束,当函数返回时,被等待线程的资源被收回
	//代码中如果没有pthread_join主线程会很快结束从而使整个进程结束,从而使创建的线程没有机会开始执行就结束了。加入pthread_join后,主线程会一直等待直到等待的线程结束自己才结束,使创建的线程有机会执行。
	pthread_join(ptid1,NULL);  

	//销毁互斥锁
	pthread_mutex_destroy(&(cnt.lock));  
	return 0;  
}  

Leave a comment

Your email address will not be published.

*