创建两个线程模拟火车站两个窗口售票程序

题目:创建两个线程模拟火车站两个窗口售票程序,窗口售票时间为1秒,两个窗口不能同时售票

#include<Windows.h>

#include<iostream>

using namespace std;

//这是2个线程模拟买火车票的小程序

DWORD WINAPI Fun1Proc(LPVOID lpParameter);//thread data

DWORD WINAPI Fun2Proc(LPVOID lpParameter);//thread data

int index = 0;

int tickets = 10;

HANDLE hMutex;

int main()

{

HANDLE hThread1;

HANDLE hThread2;

//创建线程

hThread1 = CreateThread(NULL, 0, Fun1Proc, NULL, 0, NULL);

hThread2 = CreateThread(NULL, 0, Fun2Proc, NULL, 0, NULL);

CloseHandle(hThread1);

CloseHandle(hThread2);

//创建互斥对象

hMutex = CreateMutex(NULL, TRUE, "tickets");

if (hMutex)

{

if (ERROR ALREADY EXISTS == GetLastError())

{

cout << "only one instance can run!" << endl;

return 0;

}

}

WaitForSingleObject(hMutex, INFINITE);

ReleaseMutex(hMutex);

ReleaseMutex(hMutex);

Sleep(4000);

return 0;

}

//线程1的入口函数

DWORD WINAPI Fun1Proc(LPVOID lpParameter)

{

while (true)

{

ReleaseMutex(hMutex);

WaitForSingleObject(hMutex, INFINITE);

if (tickets > 0)

{

Sleep(1);

cout << "thread1 sell ticket:" << tickets-- << endl;

}

else

break;

ReleaseMutex(hMutex);

}

return 0;

}

//线程2 的入口函数

DWORD WINAPI Fun2Proc(LPVOID lpParameter)

{

while (true)

{

ReleaseMutex(hMutex);

WaitForSingleObject(hMutex, INFINITE);

if (tickets > 0)

{

Sleep(1);

cout << "thread2 sell ticket:" << tickets-- << endl;

}

else

break;

ReleaseMutex(hMutex);

}

return 0;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-26 19:19:08

创建两个线程模拟火车站两个窗口售票程序的相关文章

java笔记线程两种方式模拟电影院卖票

1 public class SellTicketDemo { 2 public static void main(String[] args) { 3 // 创建三个线程对象 4 SellTicket st1 = new SellTicket(); 5 SellTicket st2 = new SellTicket(); 6 SellTicket st3 = new SellTicket(); 7 8 // 给线程对象起名字 9 st1.setName("窗口1"); 10 st2.

如何让两个线程同时运行

两个线程公用一个Object对象,监控线程先调用Object的wait(),添加线程执行插入,插入之后调用Object的notify() 如此反复 在run方法里加锁synchronizide,同时在锁的内部使用wait方法和notify方法使用就ok了 public class ThreadTest2 { public static void main(String[] args) { // 创建任务 // 任务一: 读取数据库,给对象赋值 Person p = new Person(); I

用两个栈模拟无限长队列

思路:设置两个栈,栈1起入队的作用.栈2起出队的作用.入队时,所有元素进栈1,栈满时会通过realloc函数追加存储空间并且保存原来栈1的元素.出队时,先判断栈2是否为空,若为空,则会判断栈1是否为空,栈1为空,则说明队列为空,栈1不为空则将栈1的元素全部出栈并入栈2,栈2满时依然通过realloc追加存储空间,然后栈2元素出栈;若栈2不为空,栈2元素直接出栈 extern void *realloc(void *mem_address, unsigned int newsize);功能:先释放

多线程——范例:建立与启动两个线程 与 范例:显示调度器有多个不可预测的结果(Head First Java的例子)

//范例:建立与启动两个线程 public class ThreadTest implements Runnable{ public static void main(String[] args) { ThreadTest runner=new ThreadTest();//创建Runnable的实例 Thread alpha=new Thread(runner); Thread beta=new Thread(runner);//创建两个线程,使用相同的Runnable,即相同的任务 alph

(转载) Android两个子线程之间通信

Android两个子线程之间通信 标签: classthreadandroid子线程通信 2015-03-20 17:03 3239人阅读 评论(0) 收藏 举报  分类: 个人杂谈 版权声明:本文为博主原创文章,未经博主允许不得转载. Android中,相信主线程和子线程之间的通信大家都不陌生了吧.在一次面试经历中被问到了两个子线程之间是如何进行通信的.哎呦!这可蒙住我了.后来回家研究了下,分享给大家. 其实android中线程通信无非就是handler和looper的操作. 一般情况下的主线

Android两个子线程之间通信

Android中,相信主线程和子线程之间的通信大家都不陌生了吧.在一次面试经历中被问到了两个子线程之间是如何进行通信的.哎呦!这可蒙住我了.后来回家研究了下,分享给大家. 其实android中线程通信无非就是handler和looper的操作. 一般情况下的主线程和子线程之间的通信,都是通过主线程中的handler把子线程中的message发给主线程中的looper,或者,主线程中的handler通过post向looper中发送一个runnable.looper默认存在于main线程中.那么子线

线程2:线程通信事件机制(单线程、两个线程、多个线程通信)

//一个线程之间的通信 DWORD WINAPI firstthread(void *p) { MessageBoxA(0, "1", "1", 0); printf("第1个线程执行完成\n"); SetEvent(event[0]);//发出事件信号 return 0; } DWORD WINAPI secondthread(void *p) { WaitForSingleObject(event[0], INFINITE);//等待even

用两个队列模拟实现一个栈的过程

栈具有"后进先出"的特点,即某个元素最后进入栈,却最先出栈:队列具有"先进先出"的特点,即元素从队尾依次进队列,依次从队头出队列:现在用两个队列模拟实现一个栈的过程,详细过程请看下面这张本人制作的gif图: 实现代码: #include <iostream> using namespace std; #include <queue> template <typename T> class Stack { public: void

用两个栈模拟实现一个队列

题目:如何用两个栈模拟实现一个队列?  如果这两个堆栈的容量分别是m和n(m>n),你的方法能保证的队列容量是多少?(这里讨论的是顺序栈,如果是链式栈的话完全没有必要考虑空间) 分析:栈的特点是“后进先出(LIFO)”,而队列的特点是“先进先出(FIFO)”.用两个栈模拟实现一个队列的基本思路是:用一个栈作为存储空间,另一个栈作为输出缓冲区,把元素按顺序压入两栈(模拟的队列),并按此顺序出队并输出即可. 如下图,用容量为m的栈作为存储空间,容量为n的栈作为输出缓冲区,一开始先将n个元素压入(pu