改进版简易卖票系统,线程操作
来源:互联网 发布:石家庄企业办公软件 编辑:程序博客网 时间:2024/05/21 00:17
前面一篇文章采用fork()函数创建子进程来卖票,随着学习的深入,发现这种操作太占用cpu资源了,所以改进了方法,利用线程,线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属于一个进程的其他的线程共享进程拥有的全部资源。代码中用到互斥量,下面给出解释
互斥量(mutex)从概念上来说类似于一个二进制信号量,即初始值为1的信号量。互斥量被获取之后就不能再被获取,因此对互斥体的获取和释放操作常常称为加锁和解锁操作。
互斥量只能由获取它的线程进行释放,如果违反这一原则,则结果是未定义的。
互斥量从本质上说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。对互斥量进行加锁以后,任何其他试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互斥量。
加入互斥量,同样也使得程序更加简洁明了。
#include <stdio.h>#include <pthread.h>#include <semaphore.h>#include <time.h>#include <string.h>int ticket = 100; // 票// 互斥锁pthread_mutex_t mutex;// 卖票线程void *sale_ticket(void *v){int window = (int)v;printf ("窗口 %d 开始卖票\n", window);while (1){int time = rand() % 100 + 1;usleep(time*10000);// 卖票前要先抢锁pthread_mutex_lock(&mutex);if (ticket == 0){pthread_mutex_unlock(&mutex);break;}printf ("窗口 %d 卖票了一张票 : %d\n", window, ticket);ticket--;pthread_mutex_unlock(&mutex);}}int main(){srand ((unsigned int)time(NULL));// 初始化互斥锁pthread_mutex_init(&mutex, NULL);// 创建卖票的线程int i = 0;for (i = 1; i < 5; i++){pthread_t therad_id;pthread_create(&therad_id, NULL, sale_ticket, (void*)i);pthread_detach(therad_id);}pthread_exit(NULL);// 销毁互斥锁pthread_mutex_destroy(&mutex);return 0;}
阅读全文
0 0
- 改进版简易卖票系统,线程操作
- 【线程】卖票系统
- 【线程】卖票系统②
- 加入信号量的简易卖票系统
- 线程,卖票
- 卖票线程
- 卖票系统
- 卖票系统
- 卖票小系统(关于线程同步的问题)
- 简单的,通过线程实现三人卖票系统。
- 卖票小系统(关于线程同步的问题)
- 用线程和互斥锁实现的简单的卖票系统
- JAVA线程实例-----卖票
- 线程学习之卖票
- 线程同步,卖票
- 线程示例:多线程卖票
- 用线程同步卖票
- 卖票——多线程模拟卖票系统
- HtmlUnit实现模拟浏览器点击按钮的效果
- static的用法详解--C语言和C++分别介绍
- TCP对SACK的处理以及乱序的处理细节
- 面向过程和面向对象
- linux sar命令
- 改进版简易卖票系统,线程操作
- 【游戏跨场景寻路】基于as3语言的游戏地图跨场景寻路功能的实现
- linux 标准流管道 popen 源码理解
- Spring Ioc创建源码分析
- HDU 4027 Can you answer these queries?——其实是点更新的区间更新线段树
- C
- HDU
- 大端小端测试代码
- D