做了個小程序,用來驗證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()
{
TCHAR szBuf[10240] = {0};// = TEXT("Thread Interlocked Experiment BEGIN!!!\n");
HANDLE harr[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)
{
// 標記1
while (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)
{
// 標記2
while(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);
}
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

