私はクリティカル セクション (マルチスレッドの目的で) について学んでおり、オンラインでそれを使用するクラスを見つけました。コードが機能しない理由がわかりません。コンソール表示で「成功」するはずですが、そうではありません。
間違ってロックしていませんか?セクションに正確に出入りしていると確信していますが、3 番目のスレッド ( mul) が機能していないように見える理由がわかりません。
メインコードは次のとおりです(VS 2012でこれを実行しています):
#include "stdafx.h"
#include <windows.h>
#include <process.h>
#include <iostream>
#include <assert.h>
#include <queue>
#include "Lock.h"
//File: CriticalSectionExample.cpp
#define MAX_THREADS 2
using namespace std;
static unsigned int counter = 100;
static bool alive = true;
static examples::Lock lock_1;
static examples::Lock lock_2;
queue<int> test_q;
queue<int> later_q;
static unsigned __stdcall sub(void *args)
{
    while(alive)
    {
        cout << "tq";
        lock_1.acquire();
        test_q.push(1);
        lock_1.release();
        ::Sleep(500);
    }
    return 0;
}
static unsigned __stdcall add(void *args)
{
    while(alive)
    {
        if (!test_q.empty())
        {
            int first = test_q.front();
            //cout << first << endl;
            lock_1.acquire();
            test_q.pop();
            lock_1.release();
            lock_2.acquire();
            cout << "lq" << first << endl;
            later_q.push(first);
            lock_2.release();
        }
        ::Sleep(500);
    }
    return 0;
}
static unsigned __stdcall mul(void *args)
{
    while(alive)
    {
        if (!later_q.empty())
        {
            cout << "success" << endl;
            lock_2.acquire();
            test_q.pop();
            lock_2.release();
        }
        ::Sleep(500);
    }
    return 0;
}
int main()
{
    // create threads
    unsigned tadd;
    HANDLE hadd = (HANDLE) ::_beginthreadex(0, 0, &add, 0, CREATE_SUSPENDED, &tadd);
    assert(hadd != 0);
    unsigned tsub;
    HANDLE hsub = (HANDLE) ::_beginthreadex(0, 0, &sub, 0, CREATE_SUSPENDED, &tsub);
    assert(hsub != 0);
     unsigned tmul;
    HANDLE hmul = (HANDLE) ::_beginthreadex(0, 0, &mul, 0, CREATE_SUSPENDED, &tsub);
    assert(hmul != 0);
    // start threads
    ::ResumeThread(hadd);
    ::ResumeThread(hsub);
    ::Sleep(10000); // let threads run for 10 seconds
    // stop & cleanup threads
    alive = false;
    ::WaitForSingleObject(hsub, INFINITE);
    ::CloseHandle(hsub);
    ::WaitForSingleObject(hadd, INFINITE);
    ::CloseHandle(hadd);
    return 0;
}
これは、クリティカル セクションを含むヘッダー ファイルです。
#ifndef _Lock_H_
#define _Lock_H_
#include <windows.h>
/**
*@description: A simple Lock implementation using windows critical section object
*/
namespace examples
{
    class Lock
    {
    public:
        Lock()
        {
            ::InitializeCriticalSection(&m_cs);
        }
        ~Lock()
        {
            ::DeleteCriticalSection(&m_cs);
        }
        void acquire()
        {
            ::EnterCriticalSection(&m_cs);
        }
        void release()
        {
            ::LeaveCriticalSection(&m_cs);
        }
    private:
        Lock(const Lock&);
        Lock& operator=(const Lock&);
        CRITICAL_SECTION m_cs;
    };
}
#endif //_Lock_H_