Chapter 8 Thread Synchronization in User Mode

来源:互联网 发布:fifaonline3数据库查询 编辑:程序博客网 时间:2024/06/05 08:47

做了个小程序,用来验证Interlocked的效果:


上图分别是注释掉“标记1”和“标记2”后的截图,和取消注释后的截图,下面是代码:


#include <windows.h>#include <stdio.h>#include <float.h>#include <process.h>#include <conio.h>#include <iostream>#include <tchar.h>using namespace std;LONG g = 0, flag = 0, T = 1, F = 0;void threadfun1(void *pNull);void threadfun2(void *pNull);int main(){TCHARszBuf[10240] = {0};// = TEXT("Thread Interlocked Experiment BEGIN!!!\n");HANDLEharr[2];harr[0] = (HANDLE)_beginthread(threadfun1, 0, szBuf);harr[1] = (HANDLE)_beginthread(threadfun2, 0, szBuf);// 如果不等两个线程结束,则极有可能主函数结束了,而那两个线程没结束!;// 也就是说,屏幕上将无任何输出!;WaitForMultipleObjects(2, harr, TRUE, INFINITE);_tprintf(szBuf);printf("%d\n", g);getch();return 0;}void threadfun1(void *pNull){// 标记1while (InterlockedExchange(&flag, T) == T);g++;int i, len, j;TCHAR *pStr = (TCHAR*)pNull;for (i = 0; i < 10; ++i){for (j = 0; j < 10; ++j){len = lstrlen(pStr);pStr[len++] = '1';pStr[len] = 0;}len = lstrlen(pStr);pStr[len++] = '\n';pStr[len] = 0;Sleep(10);// 这样使实验的效果更明显;}InterlockedExchange(&flag, F);}void threadfun2(void *pNull){// 标记2while(InterlockedExchange(&flag, T) == T);g++;int i, len, j;TCHAR *pStr = (TCHAR*)pNull;for (i = 0; i < 10; ++i){for (j = 0; j < 10; ++j){len = lstrlen(pStr);pStr[len++] = '2';pStr[len] = 0;}len = lstrlen(pStr);pStr[len++] = '\n';pStr[len] = 0;Sleep(10);}InterlockedExchange(&flag, F);}


原创粉丝点击