andruhovski icon

ossp-demo-20160928

andruhovski | PRO | 09/28/16 09:27:46 AM UTC | 0 ⭐ | 782 👁️ | Never ⏰ | []
C++ |

1.55 KB

|

None

|

0 👍

/

0 👎

// ossp-demo-20160928.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <process.h>
#include <windows.h>
 
void __cdecl my_thread(void *);
CRITICAL_SECTION CriticalSection;
int queue = 0;
 
int _tmain(int argc, _TCHAR* argv[])
{
    char a = 'A', b = 'B', c = 'C', d = 'D', e = 'E';
    HANDLE handles[5];
 
    // Initialize the critical section one time only.
    if (!InitializeCriticalSectionAndSpinCount(&CriticalSection,
        0x00000400))
        return 0;
 
    //запустити my_thread('A'); 
    handles[0]=  (HANDLE)_beginthread(my_thread, 0, &a);
    //запустити my_thread('B'); 
    handles[1] = (HANDLE)_beginthread(my_thread, 0, &b);
    //запустити my_thread('C');
    handles[2] = (HANDLE)_beginthread(my_thread, 0, &c);
    //запустити my_thread('D'); 
    handles[3] = (HANDLE)_beginthread(my_thread, 0, &d);
    //запустити my_thread('E'); 
    handles[4] = (HANDLE)_beginthread(my_thread, 0, &e);
 
    WaitForMultipleObjects(5, handles, TRUE, INFINITE);
 
    // Release resources used by the critical section object.
    DeleteCriticalSection(&CriticalSection);
    return 0;
}
 
void __cdecl my_thread(void *arg)
{
    char *ch = (char *)arg;
    for (size_t i = 0; i < 10;)
    {
        // Request ownership of the critical section.
        EnterCriticalSection(&CriticalSection);
        if (queue == (*ch - 65))
        {
            putchar(*ch);
            queue = (queue + 1) % 5;
            i++;
            if (*ch == 'E')
                putchar('\n');
        }
        // Release ownership of the critical section.
        LeaveCriticalSection(&CriticalSection);
        Sleep(200);
    }
}

Comments