1.A(主依次创建B,C),B,C三个线程
A中无pthread_mutex_lock()或 pthread_mutex_unlock();
B中开始3个pthread_mutex_unlock()然后2个pthread_mutex_lock(),照样把自己锁住;C中两个pthread_mutex_unlock()也被锁住;
2.
A中1个pthread_mutex_unlock();
B中开始3个pthread_mutex_unlock()然后2个pthread_mutex_lock(),B被解开;C中两个pthread_mutex_unlock()依然被锁住;
3.
A中2个pthread_mutex_unlock();
B中开始3个pthread_mutex_unlock()然后2个pthread_mutex_lock(),B被解开;C中两个pthread_mutex_unlock()依然被锁住;
4.
A中3个pthread_mutex_unlock();
B中开始3个pthread_mutex_unlock()然后2个pthread_mutex_lock(),B被解开;C中两个pthread_mutex_unlock()被解开;
5.pthread_cond_wait()需要两个条件才能被唤醒,pthread_mutex_unlock()与pthread_cond_signal()无先后顺序。。
(心法:S初值为1,即使不停地调用pthread_mutex_unlock()(它会首先判断S然后决定是否加1)依然不会大于1,
线程调用pthread_mutex_lock()时,若S为0则睡眠, 若S为1,则S减1继续执行。。只要S为1时,睡眠队列第一
个会被唤醒同时S减1。。所以S只有0,1两个值。。。。。。我真是个天才,,自个猜的。。)
///
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>
void* testThreadPool(void *t);
pthread_mutex_t clifd_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t clifd_cond = PTHREAD_COND_INITIALIZER;
int main()
{ char b=9;
pthread_t mythread;
if (pthread_create(&mythread, NULL, (void*)testThreadPool, (void*)(&b)))
{
printf("pthread_create\n");
}
sleep(2);
printf("father : 1\n");
pthread_mutex_lock(&clifd_mutex);
sleep(2);
printf("father : 2\n");
pthread_cond_signal(&clifd_cond);
sleep(2);
printf("father : 3\n");
pthread_mutex_unlock(&clifd_mutex);
printf("father : 4\n");
}
void* testThreadPool(void *t)
{
printf("child :t is %d\n", (*(char *)t));
printf("child :1\n");
pthread_mutex_lock(&clifd_mutex);
printf("child :2\n");
pthread_cond_wait(&clifd_cond, &clifd_mutex);
printf("child :3\n");
pthread_mutex_unlock(&clifd_mutex);
printf("child :4\n");
printf("child :5\n");
}
[root@song pthread_cont_wait]# ./song
child :t is 9
child :1
child :2
father : 1
father : 2
father : 3
child :3
child :4
child :5
father : 4
///
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>
void* testThreadPool(void *t);
void* song(void* s);
pthread_mutex_t clifd_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t clifd_cond = PTHREAD_COND_INITIALIZER;
int main()
{ char b=9;
pthread_t mythread;
pthread_t ssthread;
if (pthread_create(&mythread, NULL, (void*)testThreadPool, (void*)(&b)))
{
printf("pthread_create\n");
}
if (pthread_create(&ssthread, NULL, (void*)song, (void*)(&b)))
{
printf("pthread_create\n");
}
sleep(2);
printf("father : 1\n");
pthread_mutex_lock(&clifd_mutex);
sleep(2);
printf("father : 2\n");
pthread_cond_signal(&clifd_cond);
sleep(2);
printf("father : 3\n");
pthread_mutex_unlock(&clifd_mutex);
sleep(2);
printf("father : 4\n");
sleep(3);
}
void* testThreadPool(void *t)
{
printf("child :t is %d\n", (*(char *)t));
printf("child :1\n");
pthread_mutex_lock(&clifd_mutex);
printf("child :2\n");
pthread_cond_wait(&clifd_cond, &clifd_mutex);
printf("child :3\n");
pthread_mutex_unlock(&clifd_mutex);
printf("child :4\n");
printf("child :5\n");
pthread_cond_signal(&clifd_cond);
}
void *song(void* s)
{ printf("song:1\n");
pthread_mutex_lock(&clifd_mutex);
printf("song :2\n");
pthread_cond_wait(&clifd_cond, &clifd_mutex);
printf("song:3\n");
pthread_mutex_unlock(&clifd_mutex);
printf("song:4\n");
printf("song:5\n");
}
[root@song pthread_cont_wait]# ./song
child :t is 9
child :1
child :2
song:1
song :2
father : 1
father : 2
father : 3
child :3
child :4
child :5
song:3
song:4
song:5
father : 4
[root@song pthread_cont_wait]#