mailbox = args; /* put ptr to our args there */
printf(“COUNT%s: raising flag\n”, args->name);
pthread_cond_signal(&flag); //通知主线程信号变化
printf(“COUNT%s: unlocking box\n”, args->name);
pthread_mutex_unlock(&lock); //释放锁。
printf(“COUNT%s: unlocked box\n”, args->name);
return NULL;
}
输出:
[lizhuohua@lizhuohua-phy Program]$ ./program cp1.c cp2.c
COUNT1: waiting to get lock
COUNT2: waiting to get lock
MAIN: waiting for flag to go up
COUNT1: have lock, storing data
COUNT1: raising flag
COUNT1: unlocking box
COUNT1: unlocked box
MAIN: flag was raised, I have the lock
131: cp1.c
MAIN: waiting for flag to go up
COUNT2: have lock, storing data
COUNT2: raising flag
COUNT2: unlocking box
COUNT2: unlocked box
MAIN: flag was raised, I have the lock
131: cp2.c
262: total words
总结一下这个程序可能的执行过程:
1. 第一种
a 主线程create两个子线程后,进入到pthread_cond_wait阻塞,释放锁,等待信号
b 第一个子线程,对文件中的word计数,对互斥量加锁,
c 第二个子线程,对文件中的word计数,在pthead_mutex_lock处阻塞
d 第一个子线程,给mailbox赋值,通知信号变化,释放锁,退出, 主线程获得信号通知
e 第二个子线程,抢先主线程对互斥量加锁,判断mailbox不为NULL,释放锁,并等待信号
f 主线程对互斥量加锁,从pthread_cond_wait返回,清空mailbox,通知信号变化,并在再次循环中pthread_cond_wait释放锁,等待信号
g 第二个子线程,获得信号通知,加锁,继续执行,通知信号, 释放锁
h 主线程获得信号,加锁,继续执行,然后执行pthread_cond_signal时候已经没有线程等待。
2. 第二种
a 主线程create两个子线程后,进入到pthread_cond_wait阻塞,释放锁,等待信号
b 第一个子线程,对文件中的word计数,对互斥量加锁,
c 第二个子线程,对文件中的word计数,在pthead_mutex_lock处阻塞
d 第一个子线程,给mailbox赋值,通知信号变化,释放锁,退出, 主线程获得信号通知
e 主线程对互斥量加锁,从pthread_cond_wait返回,清空mailbox,通知信号变化,并在再次循环中pthread_cond_wait释放锁,等待信号
f 第二个子线程,对互斥量加锁,给mailbox赋值,通知信号变化,释放锁,退出, 主线程获得信号通知
g 主线程获得信号,加锁,继续执行,然后执行pthread_cond_signal时候已经没有线程等待。
问题:
分析到最后,我发现这个主线程最后退出的时候,都没有把最后一次pthread_cond_wait中加锁的互斥量解锁。
这样不解锁就退出,会有什么后果呢?