1

在我的 const' 中 - 我希望仅在 'firstCommand' 之后调用 'secondCommand'。我尝试使用 EnterCriticalSection,但问题是,在哪里启动我的锁 - 如果我在构造函数中执行此操作(在 # 处),并在“firstCommand”(在 ## 处)之后释放锁,并尝试获取锁再次在'secondCommand'之前(在###),它可能无法工作,因为在###,即使锁被锁定 - 仍然可以调用 secondCommand - 因为锁定在同一个thead中产生(就像调用连续两次“锁定”和“锁定” - 不会出现死锁)。

另一方面,如果我在“firstCommand”(####)之前锁定并在“firstCommand”(##)之后立即释放,则在检查锁是否被锁定时 - 锁可能未初始化 - 这将导致问题。这是我的代码:

myClass::myClass (){
    #
    threadFunction();
    ###
    secondCommand();
}

void myClass::threadFunction(){
    DWORD threadID;
    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadFunc,0, 0, &threadID);
}

threadFunc(){
    ####
    firstCommand();
    ##
    while(true){};
}

这似乎是一个简单的问题,但我已经尝试解决一个小时了。有人可以帮忙吗?

4

2 回答 2

2

我认为您最好使用事件:查看CreateEventSetEventWaitForSingleObject

您将在构造函数中创建事件,在“###”处等待它,然后在“##”处设置它。您可能应该检查 WaitForSingleObject 的返回值;如果成功,它将是 WAIT_OBJECT_0。

于 2013-05-29T14:41:06.933 回答
1

也许您的问题的性质并不像您发布的示例那么简单,但一种明显的方法就是这样做

myClass::myClass (){
    firstCommand();
    threadFunction();
    secondCommand();
}

void myClass::threadFunction(){
    DWORD threadID;
    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadFunc,0, 0, &threadID);
}

threadFunc(){
    while(true){};
}

是否有某些原因firstCommand必须在另一个线程上运行?

编辑
因为您需要firstCommand在后台线程上运行,所以在安全时使用事件发出信号。因此,myClass为事件句柄定义一个成员变量(或两个线程都可以访问的地方)

HANDLE m_hEvent;

并像这样使用它

myClass::myClass (){
    m_hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    threadFunction();
    WaitForSingleObject(m_hEvent, INFINITE);
    secondCommand();
    CloseHandle(m_hEvent);
    m_hEvent = NULL;
}

void myClass::threadFunction(){
    DWORD threadID;
    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadFunc,0, 0, &threadID);
}

threadFunc(){
    firstCommand();
    SetEvent(m_hEvent);
    while(true){};
}

因此,在主线程中,secondCommand等待事件在运行前发出信号。在工作线程中,事件在完成后被设置(发出信号)firstCommand

于 2013-05-29T14:47:03.530 回答