情景1:
Jack开着一辆出租车来到一个站点停车,看见没人就走了。过段时间,Susan来到站点准备乘车,但是没有来,于是就等着。过了一会Mike开着车来到了这个站点,Sunsan就上了Mike的车走了。如图所示:
程序实现该情景:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
pthread_cond_t taxicond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t taximutex = PTHREAD_MUTEX_INITIALIZER;
void *traveler_arrive(void *name)
{
char *p = (char *)name;
printf ("Travelr: %s need a taxi now!\n", p);
pthread_mutex_lock(&taximutex);
pthread_cond_wait(&taxicond, &taximutex);
pthread_mutex_unlock(&taximutex);
printf ("traveler: %s now got a taxi!\n", p);
pthread_exit(NULL);
}
void *taxi_arrive(void *name)
{
char *p = (char *)name;
printf ("Taxi: %s arrives.\n", p);
pthread_cond_signal(&taxicond);
pthread_exit(NULL);
}
int main (int argc, char **argv)
{
char *name;
pthread_t thread;
pthread_attr_t threadattr;
pthread_attr_init(&threadattr);
name = "Jack";
pthread_create(&thread, &threadattr, taxi_arrive, name);
sleep(1);
name = "Susan";
pthread_create(&thread, &threadattr, traveler_arrive, name);
sleep(1);
name = "Mike";
pthread_create(&thread, &threadattr, taxi_arrive, name);
sleep(1);
return 0;
} /* ----- End of main() ----- */
情景2:
Jack开着一辆出租车来到一个站点停车,看见没人就等着。过段时间,Susan来到站点准备乘车看见了Jack的出租车,于是就上去了。过了一会Mike开着车来到了这个站点,看见没人救等着。如图所示:
程序实现该情景:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
int travelercount = 0;
pthread_cond_t taxicond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t taximutex = PTHREAD_MUTEX_INITIALIZER;
void *traveler_arrive(void *name)
{
char *p = (char *)name;
pthread_mutex_lock(&taximutex);
printf ("traveler: %s need a taxi now!\n", p);
travelercount++;
pthread_cond_wait(&taxicond, &taximutex);
pthread_mutex_unlock(&taximutex);
printf ("traveler: %s now got a taxi!\n", p);
pthread_exit(NULL);
}
void *taxi_arrive(void *name)
{
char *p = (char *)name;
printf ("Taxi: %s arrives.\n", p);
for(;;){
if(travelercount){
pthread_cond_signal(&taxicond);
travelercount--;
break;
}
}
pthread_exit(NULL);
}
int main (int argc, char **argv)
{
char *name;
pthread_t thread;
pthread_attr_t threadattr;
pthread_attr_init(&threadattr);
name = "Jack";
pthread_create(&thread, &threadattr, taxi_arrive, name);
sleep(1);
name = "Susan";
pthread_create(&thread, &threadattr, traveler_arrive, name);
sleep(3);
name = "Mike";
pthread_create(&thread, &threadattr, taxi_arrive, name);
sleep(4);
return 0;
} /* ----- End of main() ----- */
author: fulinux
E-mail: fulinux@sina.com
blog: blog.youkuaiyun.com/fulinus