​​

事件,线程同步

内核对象都有一个计数器,Create和Open都加一,Close都减一,直到0内核对象才会销毁。

 

1、事件对象的创建

HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性 NULL时为系统默认
BOOL bManualReset, // TRUE 通过调用ResetEvent将事件对象标记为未通知
BOOL bInitialState, // TRUE 已通知状态 FALSE未通知状态
LPCTSTR lpName // 对象名称 以NULL结尾的字符串
);

OpenEvent(EVENT_ALL_ACCESS, FALSE, "XYZ");
2、事件对象的控制

BOOL SetEvent(HANDLE hEvent); //将对象设置为已通知

3、关闭时间对象句柄
//关闭句柄
CloseHandle(HANDLE);

CreateEvent第二个参数位true的话,就意味着当第一个线程waitfor到的话,事件为已通知状态,且事件状态不改变。fasle的话,只要waitfor到的话事件状态从已通知变为未通知。

线程同步程序。

#include<windows.h>
HANDLE h1;
HANDLE h2;
int x = 0;

DWORD WINAPI ThreadCustomer(LPVOID lpParameter)
{
    for(int i = 0; i < 10; i++)
    {
        WaitForSingleObject(h2, INFINITE);
        x = 0;
        DWORD id = GetCurrentThreadId();
        printf("%d------>%d\n", id, x);
        SetEvent(h1);
    }
    return 0;
}

DWORD WINAPI ThreadProduct(LPVOID lpParameter)
{
    for(int i = 0; i < 10; i++)
    {
        WaitForSingleObject(h1, INFINITE);
        x = 1;
        DWORD id = GetCurrentThreadId();
        printf("%d------>%d\n", id, x);
        SetEvent(h2);
    }
    return 0;
}

int main(int argc, char* argv[])
{
    HANDLE hThread[2];

    h1 = CreateEvent(NULL, FALSE, TRUE, NULL);
    h2 = CreateEvent(NULL, FALSE, FALSE, NULL);

    hThread[0] = ::CreateThread(NULL, 0, ThreadCustomer, NULL, 0, NULL);
    hThread[1] = ::CreateThread(NULL, 0, ThreadProduct, NULL, 0, NULL);

    WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
    CloseHandle(h1);
    CloseHandle(h2);

    CloseHandle(hThread[0]);
    CloseHandle(hThread[1]);
    return 0;

}

 

posted @ 2020-09-24 20:35  w_athena  阅读(89)  评论(0编辑  收藏  举报