interlockedexchangeadd

场景:线程同步小疑点(InterlockedExchangeAdd)

线程同步小问题(InterlockedExchangeAdd)
创建50个线程时,不用InterlockedExchangeAdd,全局变量的值也不会变
当创建500个线程时,即便用了InterlockedExchangeAdd,最终输出的全局变量值也不是500
纳闷儿了。。难道线程同步还跟线程个数有关系?

C/C++ code

// 互锁函数测试

#include "stdafx.h"
#include <windows.h>

LONG g_int = 0;
#define THREAD_COUNT 500

UINT WINAPI ThreadProc(LPVOID lParam)
{
    g_int++;
    //InterlockedExchangeAdd(&g_int, 1);
    return 0;
}


int _tmain(int argc, _TCHAR* argv[])
{

    HANDLE hThread[THREAD_COUNT];

    for (int i = 0; i < THREAD_COUNT; i++)
    {
        hThread[i] = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ThreadProc,NULL, NULL, NULL);
        if (hThread[i] == NULL)
        {
            printf("创建线程失败.");
        }
    }

    WaitForMultipleObjects(THREAD_COUNT, hThread, TRUE, INFINITE);

    printf("全局变量的值是:%d", g_int);
    return 0;
}




------解决方案--------------------
WaitForMultipleObjects等待最大数量为64
500的话WaitForMultipleObjects直接报错返回,主线程都退出了,其他线程也强制退出了
可改成循环WaitForSingleObject
------解决方案--------------------
用Mutex,临界区其他方式同步试试呢
------解决方案--------------------
可能你的线程函数中写的过于简单了只有一条自增的语句,你写成这样再试试
C/C++ code

UINT WINAPI ThreadProc(LPVOID lParam)
{
    int i=0;
    while(1)
    {
        g_int ++;
        Sleep(1);
        if(++i >= 10)
            break;
    }
    
    //InterlockedExchangeAdd(&g_int, 1);
    return 0;
}

------解决方案--------------------
额,是你声明问题,估计编译器优化掉了,你要改成这样:

volatile LONG g_int = 0;

------解决方案--------------------
还有一个要注意的地方是使用 interlocked 函数操作的变量要字节对齐
不过你的代码中的是全局变量,那是对齐好了的
------解决方案--------------------
学习学习
------解决方案--------------------
探讨

引用:

额,是你声明问题,估计编译器优化掉了,你要改成这样:

volatile LONG g_int = 0;


木有用。也许大概可能是VS2008太牛了吧。。线程都不需要同步机制了。。

------解决方案--------------------
探讨

WaitForMultipleObjects等待最大数量为64
500的话WaitForMultipleObjects直接报错返回,主线程都退出了,其他线程也强制退出了
可改成循环WaitForSingleObject

------解决方案--------------------
我顶。。。刚刚看完源码,不错的电影,推荐下,楼主,帮你搞定了,改了点小地方

C/C++ code


// 互锁函数测试

#include "stdafx.h"
#include <windows.h>

volatile LONG g_int = 0;
#define THREAD_COUNT 500

UINT WINAPI ThreadProc(LPVOID lParam)
{
    //g_int++;
    InterlockedExchangeAdd(&g_int, 1);
    return 0;
}


int _tmain(int argc, _TCHAR* argv[])
{

    HANDLE hThread[THREAD_COUNT];

    for (int i = 0; i < THREAD_COUNT; i++)
    {
        hThread[i] = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ThreadProc,NULL, NULL, NULL);
        if (hThread[i] == NULL)
        {
            printf("创建线程失败.");
        }
    }

    // WaitForMultipleObjects(THREAD_COUNT, hThread, TRUE, INFINITE);
    for (int i = 0; i < THREAD_COUNT; i++)
    {
        WaitForSingleObject(hThread[i], INFINITE);
    }

    printf("全局变量的值是:%d", g_int);
    getchar();
    return 0;
}