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

时间: 2024-11-05 18:31:45

windows 线程同步学习测试-1的相关文章

Windows线程同步

说到windows线程同步的方法,有循环锁,临界区(关键代码段),内核对象(Event,Semaphore,Mutex).甚至进程,线程handle等等. 说说用法: 临界区和mutex都可以用于控制共享资源的互斥访问,不同点是 临界区是用户级对象,消耗小,速度快,但是不能跨进程.mutex是内核对象速度慢,但是可以跨进程. semaphore可以用来进行资源控制,信号量的两个关键参数,现有资源数和最大资源数,可以用于对资源的控制,通过ReleaseSemaphore对资源增加,WaitFor*

Windows线程同步总结

Windows线程同步 Windows的线程同步可以利用互斥对象来实现,也可以使用事件对象,关键代码段来实现. 1 事件对象实现线程同步 <1>Event对象创建函数 事件对象的创建事件对象属于内核对象,它包含以三个成员:使用计数,是否是自动重置还是人工重置的布尔值,通知状态的布尔值. HANDLE CreateEvent( LPSECURITY_ATTRIBUTESlpEventAttributes, BOOLbManualReset, BOOLbInitialState, LPCSTRlp

windows线程同步之原子锁(原子访问)

原子锁(原子访问):一个线程在访问某个资源的同时必须确保其他线程不会同时访问此资源. 没有实现原子锁的结果: //定义一个全局变量 long g_lx = 0; DWORD WINAPI ThreadFunc1(PVOID pvParam){ for( int index=0; index<10000; index++ ) { g_lx++: //g_lx加1: } return 0: } DWORD WINAPI ThreadFunc2(PVOID pvParam){ for( int ind

Windows线程同步(未完)

先介绍一个创建线程的API,参考:https://msdn.microsoft.com/en-us/library/windows/desktop/ms682453%28v=vs.85%29.aspx Creates a thread to execute within the virtual address space of the calling process. HANDLE WINAPI CreateThread( _In_opt_ LPSECURITY_ATTRIBUTES lpThr

Windows线程同步【2】临界区

临界区是线程同步的一种实现方式.Windows提供了4个关于临界区的函数(InitializeCriticalSection,EnterCriticalSection,LeaveCriticalSection,DeleteCriticalSection),要想使用这些函数,必须先有一个临界区变量, CRITICAL_SECTION cs; 临界区变量,不能复制,不能移动,也不能读取里面的字段(可以取临界区变量的地址).总而言之,我们在编写程序时,必须把临界区变量当成一个黑箱,一切对临界区的操作必

windows 线程同步

Windows 临界区,内核事件,互斥量,信号量. 临界区,内核事件,互斥量,信号量,都能完成线程的同步,在这里把他们各自的函数调用,结构定义,以及适用情况做一个总结. 临界区: 适用范围:它只能同步一个进程中的线程,不能跨进程同步.一般用它来做单个进程内的代码快同步,效率比较高. 相关结构:CRITICAL_SECTION  _critical 相关方法: /*初始化,最先调用的函数.没什么好说的,一般windows编程都有类似初始化的方法*/ InitializeCriticalSectio

几组线程同步代码测试

1. public class A { public void MA() { lock (typeof(A)) { Thread.Sleep(5000); Console.WriteLine("MA:" +DateTime.Now); } } public void MB() { Thread.Sleep(100); Console.WriteLine("MB:" + DateTime.Now); } } } private void button4_Click(o

Windows线程同步【3】互斥锁(Mutex)

我们前面讲过的临界区,如同一个小房间,张三进去了,李四就不能进,如果李四要进,必须等张三出来. 今天我们要讲的互斥锁,像一个物件,这个物件只能同时被一个线程持有.如此一来,便可以通过互斥锁来实现线程的同步. 一.创建 创建互斥锁的方法是调用函数CreateMutex: CreateMutex(&sa, bInitialOwner, szName); 第一个参数是一个指向SECURITY_ATTRIBUTES结构体的指针,一般的情况下,可以是nullptr. 第二个参数类型为BOOL,表示互斥锁创

Windows线程同步【5】条件变量(Condition Variable)

一.引言 假设有一个任务,由我和张三共同完成.张三把寄来的文稿初步审阅后放入一个队列,我负责将这个队列中的文稿进行审批,决定刊登与否.张三审阅一份文稿需要15分钟,我处理一个文稿需要2分钟. 如果将张三和我看作两个线程,那么我们共享一个队列的数据.按照一般的多线程思路,他每隔一段时间往队列中放入数据,我每隔一段时间检查一下队列中是否有数据,若有,则处理之. 若我们按照上面的方式工作,则大部分的时间,我只是在干等着,所以,这是一种比较低效的方式. 但换一种方式之后,情况就好很多了.他每把一个文稿放