c++ - 如何使用互斥使两个线程严格交替?

标签 c++ multithreading winapi

我需要创建两个严格交替的线程。这是我使用的示例代码:

#include <Windows.h>
#include <iostream>
using std::cout;
using std::endl;

HANDLE g_hMutex1;
HANDLE g_hMutex2;

DWORD WINAPI ThreadFunc1(LPVOID lpParam);
DWORD WINAPI ThreadFunc2(LPVOID lpParam);

int main(void)
{
    int nCalcNumber = 10;
    DWORD dwThreadId;
    HANDLE pThreadHandles[2];

    g_hMutex1 = CreateMutex(NULL, FALSE, NULL);
    g_hMutex1 = CreateMutex(NULL, FALSE, NULL);

    pThreadHandles[0] = CreateThread(
        NULL,
        0,
        ThreadFunc1,
        static_cast<void*>(&nCalcNumber),
        0,
        &dwThreadId);

    pThreadHandles[1] = CreateThread(
        NULL,
        0,
        ThreadFunc2,
        static_cast<void*>(&nCalcNumber),
        0,
        &dwThreadId);

    WaitForMultipleObjects(2, pThreadHandles, TRUE, INFINITE);

    CloseHandle(pThreadHandles[0]);
    CloseHandle(pThreadHandles[1]);
    CloseHandle(g_hMutex1);
    CloseHandle(g_hMutex2);

    return 0;
}

DWORD WINAPI ThreadFunc1(LPVOID lpParam)
{
    int* nCalcNumber = static_cast<int*>(lpParam);

    for (int i = 0; i < *nCalcNumber; i++)
    {
        WaitForSingleObject(g_hMutex1, INFINITE);

        cout << "Func 1" << endl;

        ReleaseMutex(g_hMutex1);
    }

    return 0;
}

DWORD WINAPI ThreadFunc2(LPVOID lpParam)
{
    int* nCalcNumber = static_cast<int*>(lpParam);

    for (int i = 0; i < *nCalcNumber; i++)
    {
        WaitForSingleObject(g_hMutex1, INFINITE);

        cout << "Func 2" << endl;

        ReleaseMutex(g_hMutex1);
    }

    return 0;
}

以及我希望收到的结果:

 Func 1
 Func 2
 Func 1
 Func 2
 Func 1
 Func 2
 ...and so one

应该添加什么以获得期望的结果。我可以为此使用第二个互斥体吗?

最佳答案

如其他答案所述,信号量是比互斥量更好的选择。但作为一个纯粹的学术练习(家庭作业?),您也可以使用互斥锁来完成。 (强调:这是一个纯粹的学术练习。真正的程序不应该使用这种技术。)

DWORD WINAPI ThreadFunc1(LPVOID lpParam)
{
    int* nCalcNumber = static_cast<int*>(lpParam);

    WaitForSingleObject(g_hMutex2, INFINITE);
    for (int i = 0; i < *nCalcNumber; i++)
    {
        WaitForSingleObject(g_hMutex1, INFINITE);
        ReleaseMutex(g_hMutex2);

        cout << "Func 1" << endl;

        ReleaseMutex(g_hMutex1);
        WaitForSingleObject(g_hMutex2, INFINITE);
    }

    return 0;
}

DWORD WINAPI ThreadFunc2(LPVOID lpParam)
{
    int* nCalcNumber = static_cast<int*>(lpParam);

    WaitForSingleObject(g_hMutex2, INFINITE);
    for (int i = 0; i < *nCalcNumber; i++)
    {
        WaitForSingleObject(g_hMutex1, INFINITE);
        ReleaseMutex(g_hMutex2);

        cout << "Func 2" << endl;

        ReleaseMutex(g_hMutex1);
        WaitForSingleObject(g_hMutex2, INFINITE);
    }

    return 0;
}

Mutex 1 是“我有它”互斥锁,Mutex 2 是“我想要它下一个”互斥锁。

关于c++ - 如何使用互斥使两个线程严格交替?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7943974/

相关文章:

java - swingWorker调用的synchronized方法被中断?

java - 私有(private)不可变对象(immutable对象)的同步块(synchronized block)和同步方法的区别

c++ - 获取 H.264 视频的解码器 MFT

c++ - 是否可以从外部设置 ClientHello 随机数

java - 线程对于某些值提前停止

c++ - 为什么 cin.getline() 不起作用(C++)?

c# - 在 WPF 窗口中托管外部应用程序

windows - DLLMain lpReserved 参数的真正含义是什么?

c++ - 将 all_of 与 lambda 函数集合一起使用?

c++ - Qt 覆盖 QLabel PaintEvent