做了個小程序,用來驗證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); // 如果不等兩個線程結(jié)束,則極有可能主函數(shù)結(jié)束了,而那兩個線程沒結(jié)束!; // 也就是說,屏幕上將無任何輸出!; 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); }
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
