当前位置:首页 > 操作系统 > Windows

windows 线程同步学习测试-1

环境win7旗舰64位系统,vs2013,AMD fx?4100 Auad-core processor ,8G内存,

看《windows核心编程》线程同步一章,看到有说g_x++会不同步的问题,试着写些代码加深印象。发现+1太快了,看不出效果,于是for循环了1亿次。代码如下:

 

#include <span>"</span><span>stdafx.h</span><span>"</span><span>using</span> std::cout; <span>using</span> std::endl; <span>using</span><span> std::cin;

unsigned __stdcall ThreadFunRun(</span><span>void</span> * paData)<span>//</span><span>vs默认是__cdecl 调用</span><span>{
    </span><span>int</span> *iData = (<span>int</span>*<span>)paData;
    </span><span>for</span> (<span>int</span> index = <span>0</span>; index < <span>100000000</span>; ++<span>index)
    {
        (</span>*iData)++<span>;
    }
    </span><span>//</span><span>cout <<"线程函数中"<< *iData << endl;</span><span>return</span><span>0</span><span>;
}

</span><span>using</span><span> std::vector;

vector</span><HANDLE> createThread(<span>int</span> &<span>ivalue)
{
    vector</span><HANDLE><span> vecH;
    </span><span>const</span><span>int</span> iThrCount = <span>2</span><span>;
    </span><span>for</span> (<span>int</span> index = <span>0</span>; index < iThrCount; ++<span>index)
    {
        HANDLE hpt1 </span>=<span> (HANDLE)_beginthreadex(
            NULL,</span><span>//</span><span>SECURITY_ATTRIBUTES</span><span>0</span>,<span>//</span><span>cbStackSize</span><span>            ThreadFunRun,
            </span>&<span>ivalue,
            </span><span>0</span><span>,
            NULL
            );
        vecH.push_back(hpt1);
    }

    </span><span>return</span><span> vecH;
}

</span><span>bool</span> waitForRun(vector<HANDLE> &<span> hs)
{
    </span><span>for</span> (<span>int</span> index = <span>0</span>; index < hs.size(); ++<span>index)
    {
        DWORD dwaitRes </span>=<span> WaitForSingleObject(hs[index], INFINITE);
        </span><span>if</span> (dwaitRes !=<span>WAIT_FAILED)
        {
            CloseHandle(hs[index]);
        }
        </span><span>else</span><span>
        {
            cout </span><< <span>"</span><span>等待时出错,出错ID:</span><span>"</span> << GetLastError() <<<span> endl;
            </span><span>for</span> (; index < hs.size();++<span>index)
            {
                CloseHandle(hs[index]);
            }
            </span><span>return</span><span>false</span><span>;
        }
    }

    </span><span>return</span><span>true</span><span>;
}
</span><span>int</span> _tmain(<span>int</span> argc, _TCHAR*<span> argv[])
{


    </span><span>const</span><span>int</span> icount = <span>50</span><span>;
    </span><span>for</span> (<span>int</span> index = <span>0</span>; index < icount; ++<span>index)
    {
        </span><span>int</span> ivCalc = <span>0</span><span>;
        vector</span><HANDLE>  hsGet =<span> createThread(ivCalc);
</span><span>//</span><span>        Sleep(60);
</span><span>//</span><span>        cout << ivCalc << endl;</span><span>if</span><span> (waitForRun(hsGet))
             cout </span><< ivCalc <<<span> endl;
         </span><span>else</span><span>
             cout</span><<<span>"</span><span>第 </span><span>"</span><<index << <span>"</span><span> 次等待线程结束出错</span><span>"</span> <<<span> endl;
  }
 </span><span>return</span><span>0</span><span>;
 }</span>

 

 

运行效果部分复制如下:

103142316
103378991
114315655
113482883
112601936
103115533
104226349
116483624
118944471
117040062
117731078
104095516
113767825
108898288
114825927
102189580
98102943
114165950
113351409
114693549
103554014
103167647
113206459
103698422

结果甚至有小于1亿的。

原文:http://www.cnblogs.com/xiarl/p/4541783.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐