事件Event

本文展示了一个使用Windows API创建线程并通过事件进行同步的例子。两个线程共享一个票数资源,通过事件来协调彼此的工作,确保每次只有一个线程能够执行售票操作。


参考链接:

http://blog.youkuaiyun.com/morewindows/article/details/7445233


#include "stdio.h"
#include <windows.h>
#include <iostream>

using namespace std;

int tickets = 100;
HANDLE g_hEvent;

DWORD WINAPI ThreadProc1(LPVOID lpParam);
DWORD WINAPI ThreadProc2(LPVOID lpParam);


int main()
{
	
	g_hEvent = CreateEvent(	NULL, 			// 安全控制,一般直接传入NULL。
							FALSE, 			// 确定事件是手动置位还是自动置位,传入TRUE表示手动置位,传入FALSE表示自动置位。
							FALSE, 			// 事件的初始状态,传入TRUE表示已触发。
							NULL);			// 事件的名称,传入NULL表示匿名事件。

	HANDLE handle1 = CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL);
	HANDLE handle2 = CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL);
		
	// 事件初始化为未触发状态,在创建两个线
	// 程后两个线程都停在WaitForSingleObject
	// 那里,需要SetEvent事件才能让WaitForSingleObject
	// 获取事件 
	SetEvent(g_hEvent);	
	
	while(1);
	
}


DWORD WINAPI ThreadProc1(LPVOID lpParam)
{
	while(TRUE)
	{
		WaitForSingleObject(g_hEvent, INFINITE);	// 事件初始化为自动置位,表示等到事件的时候就默认ResetEvent了事件 
		/*printf("ThreadProc1 get Event\n");
		ResetEvent(g_hEvent);	
		while(1);*/
		if(tickets > 0)
		{
			Sleep(1);
			cout << "Thread1 sell ticket:" << tickets-- << endl;
			SetEvent(g_hEvent);
		}
		else
		{
			SetEvent(g_hEvent);
			break;
		}
	}
	
	return 0;
}

DWORD WINAPI ThreadProc2(LPVOID lpParam)
{
	while(TRUE)
	{
		WaitForSingleObject(g_hEvent, INFINITE);
		/*printf("ThreadProc2 get Event\n");
		ResetEvent(g_hEvent);	
		while(1);*/
		if(tickets > 0)
		{
			Sleep(1);
			cout << "Thread2 sell ticket:" << tickets-- << endl;
			SetEvent(g_hEvent);
		}
		else
		{
			SetEvent(g_hEvent);
			break;
		}
	}
	
	return 0;
}



在 MySQL 中,可以通过 `DROP EVENT` 语句删除一个或多个已创建的事件event)。事件是存储在数据库中的一种对象,用于在指定的时间或间隔自动执行某些任务。删除事件的操作需要具有足够的权限,例如 `EVENT` 权限。 ### 删除事件的基本语法如下: ```sql DROP EVENT [IF EXISTS] event_name; ``` - `IF EXISTS` 是可选参数,用于防止在指定事件不存在时产生错误。如果事件不存在且未使用该参数,MySQL 将返回错误信息。 - `event_name` 是要删除的事件的名称。 例如,要删除名为 `daily_cleanup` 的事件,可以使用以下语句: ```sql DROP EVENT IF EXISTS daily_cleanup; ``` 此语句将从数据库中永久删除事件 `daily_cleanup`,并且无法恢复。执行该操作后,事件将不再出现在 `INFORMATION_SCHEMA.EVENTS` 表中[^1]。 ### 注意事项: 1. **权限要求**:用户必须具有对事件的 `ALTER` 或 `DROP` 权限,才能执行删除操作。 2. **事件调度器状态**:如果事件调度器(`event_scheduler`)被禁用,删除事件的操作仍然可以执行,因为该操作仅影响事件定义,而不影响其执行状态。 3. **依赖关系**:如果事件依赖于某些表、存储过程或其他数据库对象,删除事件不会影响这些对象本身。 ### 查看当前事件 在删除事件之前,可以通过以下语句查看当前数据库中存在的事件: ```sql SELECT * FROM information_schema.EVENTS; ``` 此查询将列出所有事件及其详细信息,包括事件名称、所属数据库、定义者、执行时间等。 ### 示例:删除事件并验证 ```sql -- 查看所有事件 SELECT EVENT_NAME, EVENT_SCHEMA, DEFINER FROM information_schema.EVENTS WHERE EVENT_SCHEMA = 'your_database'; -- 删除指定事件 DROP EVENT IF EXISTS your_database.your_event; -- 再次查询以确认事件是否已删除 SELECT EVENT_NAME, EVENT_SCHEMA, DEFINER FROM information_schema.EVENTS WHERE EVENT_SCHEMA = 'your_database'; ``` 通过上述步骤,可以确保事件被正确删除,并验证删除操作是否成功。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值