Linux 多线程实例_《买票退票系统》
(一)多线程 mutex 互斥锁方式设计 买票退票系统,用 rand()函数定义退票随机.
/* pthread_mutex_ticket:pthread_test2.c*/
#include
#include
#include
#include
#include
//共有 50 张车票
int tickets=50;
pthread_mutex_t mutex;
int number; //随机数 sand()返回的变量名
void pthread1(void *arg); //
void pthread2(void *arg); //
int main(int argc, char *argv[])
{
pthread_t id1,id2;
int ret;
pthread_mutex_init(&mutex, NULL); //
/*creat pthread1*/
ret=pthread_create(&id1,NULL,(void *)pthread1,NULL);
if(ret!=0)
{
perror("pthead creat1");
}
/*creat pthread2*/
ret=pthread_create(&id2,NULL,(void *)pthread2,NULL);
if(ret!=0)
{
perror("pthead cread2");
}
pthread_join(id1,NULL);
pthread_join(id2,NULL);
exit(0);
}
void pthread1(void *arg)
{
while(1)
{
number=rand() % 10;
if(number<10&&number>2)
{
if(tickets>0)
{
if(pthread_mutex_lock(&mutex)!=0)
{
perror("pthread_mutex_lock");
}
tickets--;
printf("There are %d tickets now ,rand=%d \n",tickets,number);
//每循环 1 次卖出 1 张
if(pthread_mutex_unlock(&mutex)!=0)
{
perror("pthread_mutex_unlock");
}
sleep(1);
}
else
{
printf("\nThe tickets have sold out.\n");
exit(0);
}
}
}
}
void pthread2(void *arg)
{
int nolock=0;
while(1)
{
number=rand() % 10;
if(number>=0&&number<2)
{
if(pthread_mutex_trylock(&mutex)!=0)
{
perror("pthread_mutex_trylock");
exit(1);
}
tickets++; //每循环 1 次退 1 张
printf("Sold there are %d tickets now ,rand=%d \n",tickets,number);
if(pthread_mutex_unlock(&mutex)!=0)
{
perror("pthread_mutex_unlock");
}
sleep(5);
}
}
保存为:pthread_test1.c
编译: gcc pthread_test1.c –o pthread_test1 –l pthread –g
运行当前目录下 ./pthread_test1
(一) 多线程信号量方式设计 买票退票系统,用 rand()函数定义退票随机.
/* pthread_signal_sem_ticket:pthread_test1.c*/
#include
#include
#include
#include
#include
#include
#include
int tickets=50;
sem_t sem;
int number;
void pthread1(void *arg); //
void pthread2(void *arg); //
int main(int argc, char *argv[])
{
pthread_t id1,id2;
int ret;
ret =sem_init(&sem,0,1);
if(ret!=0)
{
perror("sem_init");
}
/*creat pthread1*/
ret=pthread_create(&id1,NULL,(void *)pthread1,NULL);
if(ret!=0)
{
perror("pthead creat1");
}
/*creat pthread2*/
ret=pthread_create(&id2,NULL,(void *)pthread2,NULL);
if(ret!=0)
{
perror("pthead cread2");
}
pthread_join(id1,NULL);
pthread_join(id2,NULL);
exit(0);
}
void pthread1(void *arg)
{
while(1)
{
number=rand() % 10;
if(number<10&&number>2)
{
if(tickets>0)
{
sem_wait(&sem);
tickets--;
printf("There are %d tickets now.rand=%d.\n",tickets,number);
sem_post(&sem);
sleep(1);
}
else
{
printf("\nThe tickets have sold out.\n");
exit(0);
}
}
}
}
void pthread2(void *arg)
{
int nolock=0;
while(1)
{
number=rand() % 10;
if(number>=0&&number<2)
{
sem_wait(&sem);
tickets++;
printf("Ticket back.There are %d tickets now.rand=%d.\n",tickets,number);
sem_post(&sem);
sleep(3);
}
}
}
保存为:pthread_test2.c
编译: gcc pthread_test2.c –o pthread_test2 –l pthread –g
运行当前目录下 ./pthread_test2