• windows 线程同步学习测试-1


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

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

    #include "stdafx.h"
    
    using std::cout; using std::endl; using std::cin;
    
    unsigned __stdcall ThreadFunRun(void * paData)//vs默认是__cdecl 调用
    {
        int *iData = (int*)paData;
        for (int index = 0; index < 100000000; ++index)
        {
            (*iData)++;
        }
        //cout <<"线程函数中"<< *iData << endl;
        return 0;
    }
    
    using std::vector;
    
    vector<HANDLE> createThread(int &ivalue)
    {
        vector<HANDLE> vecH;
        const int iThrCount = 2;
        for (int index = 0; index < iThrCount; ++index)
        {
            HANDLE hpt1 = (HANDLE)_beginthreadex(
                NULL,//SECURITY_ATTRIBUTES
                0,//cbStackSize
                ThreadFunRun,
                &ivalue,
                0,
                NULL
                );
            vecH.push_back(hpt1);
        }
    
        return vecH;
    }
    
    bool waitForRun(vector<HANDLE> & hs)
    {
        for (int index = 0; index < hs.size(); ++index)
        {
            DWORD dwaitRes = WaitForSingleObject(hs[index], INFINITE);
            if (dwaitRes !=WAIT_FAILED)
            {
                CloseHandle(hs[index]);
            }
            else
            {
                cout << "等待时出错,出错ID:" << GetLastError() << endl;
                for (; index < hs.size();++index)
                {
                    CloseHandle(hs[index]);
                }
                return false;
            }
        }
    
        return true;
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
    
    
        const int icount = 50;
        for (int index = 0; index < icount; ++index)
        {
            int ivCalc = 0;
            vector<HANDLE>  hsGet = createThread(ivCalc);
    //        Sleep(60);
    //        cout << ivCalc << endl;
             if (waitForRun(hsGet))
                 cout << ivCalc << endl;
             else
                 cout<<""<<index << " 次等待线程结束出错" << endl;
      }
     return 0;
     }

     

    运行效果部分复制如下:

    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亿的。

  • 相关阅读:
    ural 1227 dfs判环&求最长路
    uva 11990 块状链表
    图论·二分图
    图论·双连通分量
    图论·欧拉迹
    组合博弈
    解题策略·状态精简
    组合计数·棋盘统计
    组合计数·图形统计
    组合计数·经典序列问题
  • 原文地址:https://www.cnblogs.com/xiarl/p/4541783.html
Copyright © 2020-2023  润新知