线程同步小问题(InterlockedExchangeAdd)
创建50个线程时,不用InterlockedExchangeAdd,全局变量的值也不会变
当创建500个线程时,即便用了InterlockedExchangeAdd,最终输出的全局变量值也不是500
纳闷儿了。。难道线程同步还跟线程个数有关系?
// 互锁函数测试#include "stdafx.h"#include <windows.h>LONG g_int = 0;#define THREAD_COUNT 500UINT 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;}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 函数操作的变量要字节对齐
不过你的代码中的是全局变量,那是对齐好了的
[解决办法]
学习学习
[解决办法]
// 互锁函数测试#include "stdafx.h"#include <windows.h>volatile LONG g_int = 0;#define THREAD_COUNT 500UINT 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;}