临界区和事件

1.使用事件去控制线程1和线程2

#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>

HANDLE event[3] = { 0 };    //代表事件
HANDLE hthread[3] = { 0 };    //代表线程

DWORD WINAPI firstthread(void *p)
{
    MessageBoxA(0, "1", "1", 0);
    printf("第一个线程执行完成");
    SetEvent(event[0]);
    return 0;
}

WORD WINAPI secondthread(void *p)
{
    WaitForSingleObject(event[0], INFINITE);    //等待event信号出现
    MessageBoxA(0, "2", "2", 0);
    printf("第二个线程执行完成");
    return 0;
}


void main()
{
    //event[0] = CreateEvent(NULL, TRUE, FALSE, NULL);                                                        
    //创建事件的四个属性:
    //SECURITY_ATTRIBUTES,指定一个结构,用于设置对象的安全特性。如变成ByVal As Long,并传递零值,则表明使用对象默认的安全设置
    //Long,如果为TRUE,表示创建一个人工重设事件;如果为FALSE,表示创建一个自动重设事件
    //Long,如事件应内部进入触发状态,则为TRUE
    //String,指定事件对象的名字。用vbNullString创建一个未命名事件对象。如已经存在拥有这个名字的一个事件,则现有的命名事件就会打开。这个名字可能不与一个现有互斥体、信号机、可等待计时器或文件映射的名字相符
    event[0] = CreateEvent(NULL, TRUE, FALSE, NULL);
    event[1] = CreateEvent(NULL, TRUE, FALSE, NULL);

    hthread[0]=CreateThread(NULL, 0, firstthread, NULL, 0, NULL);
    hthread[1]=CreateThread(NULL, 0, secondthread, NULL, 0, NULL);
    
    WaitForMultipleObjects(2, hthread, TRUE, INFINITE);
    printf("全部完成");
    system("pause");
}

Wait...中将INFINITE改成5000就表示等待5秒,而不是无限,它的单位是毫秒。

原文地址:https://www.cnblogs.com/sjxbg/p/5767971.html