InterlockedIncrement vs InterlockedIncrementAcquire / Release(Redux)

时间:2014-09-09 08:50:11

标签: c++ c windows synchronization atomic

这是此question

的后续内容

我想我不理解Interlocked Acquire / Release API。我把下面的小程序放在一起。据我了解,g_val_1,g_val_2和g_val_3应始终以相同的顺序更新,并且最终应该以相同的值结束。但他们没有(对于多个线程)。

我错过了什么?感谢。

#include "windows.h"
#include "stdio.h"

#define _THREADS_    100
#define _TICKS_      1000

int volatile g_threads = 0;
DWORD volatile g_val_1 = 0;
DWORD volatile g_val_2 = 0;
DWORD volatile g_val_3 = 0;

BOOL g_running = TRUE;

DWORD TestThread(PVOID ignore)
{
    while (g_running)
    {
        InterlockedIncrementAcquire(&g_val_1);
        g_val_2++;
        InterlockedIncrementRelease(&g_val_3);
    }
    InterlockedDecrement(&g_threads);
    return(0);
}

int __cdecl main(int argc, char* argv[])
{
    int th, duration;
    int success;
    DWORD ticks;
    duration = _TICKS_;
    g_threads = _THREADS_;
    printf("Max=%d Threads=%d Entries=%d\n", duration, g_threads);
    printf("Creating Threads\n");
    th = g_threads;
    while (th-- > 0)
    {
        CreateThread(NULL,
                0,
                TestThread,
                NULL,
                NORMAL_PRIORITY_CLASS,
                NULL);
    }
    printf("Starting Threads\n");
    ticks = GetTickCount();
    while ((GetTickCount() - ticks) < duration);
    g_running = FALSE;
    while (g_threads > 0);
    ticks = GetTickCount() - ticks;
    success = ((g_val_1 == g_val_2) && (g_val_1 == g_val_2));
    printf("Duration=%d g_val_1=%d g_val_2=%d g_val_3=%d OK=%d\n", ticks, g_val_1, g_val_2, g_val_3, success);
}

0 个答案:

没有答案