精华内容
下载资源
问答
  • windows 创建线程

    千次阅读 2018-03-22 09:54:41
    一个进程可以拥有多个线程,但是一个线程必须有一个进程。线程自己不拥有系统资源,只有运行所必须的一些数据结构,但它可以与同属于一个进程的其它线程共享进程所拥有的全部资源,同一个进程中的多个线...

    1:  出自: http://blog.csdn.net/u012877472/article/details/49721653

    CreateThread:


    线程是进程中的一个实体,是被系统独立调度和分派的基本单位。一个进程可以拥有多个线程,但是一个线程必须有一个进程。线程自己不拥有系统资源,只有运行所必须的一些数据结构,但它可以与同属于一个进程的其它线程共享进程所拥有的全部资源,同一个进程中的多个线程可以并发执行。

    在C/C++中可以通过CreateThread函数在进程中创建线程,函数的具体格式如下:

    [cpp]  view plain  copy
    1. HANDLE CreateThread(  
    2.                     LPSECURITY_ATTRIBUTES lpThreadAttributes,  
    3.                     DWORD dwStackSize,  
    4.                     LPTHREAD_START_ROUTINE lpStartAddress,  
    5.                     LPVOID lpParameter,  
    6.                     DWORD dwCreationFlags,  
    7.                     LPDWORD lpThreadID  
    8.                    );  
    参数的含义如下:

    lpThreadAttrivutes:指向SECURITY_ATTRIBUTES的指针,用于定义新线程的安全属性,一般设置成NULL;

    dwStackSize:分配以字节数表示的线程堆栈的大小,默认值是0;

    lpStartAddress:指向一个线程函数地址。每个线程都有自己的线程函数,线程函数是线程具体的执行代码;

    lpParameter:传递给线程函数的参数;

    dwCreationFlags:表示创建线程的运行状态,其中CREATE_SUSPEND表示挂起当前创建的线程,而0表示立即执行当前创建的进程;

    lpThreadID:返回新创建的线程的ID编号;

    如果函数调用成功,则返回新线程的句柄,调用WaitForSingleObject函数等待所创建线程的运行结束。函数的格式如下:

    [cpp]  view plain  copy
    1. DWORD WaitForSingleObject(  
    2.                           HANDLE hHandle,  
    3.                           DWORD dwMilliseconds  
    4.                          );  
    参数的含义如下:

    hHandle:指定对象或时间的句柄;

    dwMilliseconds:等待时间,以毫秒为单位,当超过等待时间时,此函数返回。如果参数设置为0,则该函数立即返回;如果设置成INFINITE,则该函数直到有信号才返回。

    一般情况下需要创建多个线程来提高程序的执行效率,但是多个线程同时运行的时候可能调用线程函数,在多个线程同时对一个内存地址进行写入操作,由于CPU时间调度的问题,写入的数据会被多次覆盖,所以要使线程同步。

    就是说,当有一个线程对文件进行操作时,其它线程只能等待。可以通过临界区对象实现线程同步。临界区对象是定义在数据段中的一个CRITICAL_SECTION结构,Windows内部使用这个结构记录一些信息,确保同一时间只有一个线程访问改数据段中的数据。

    使用临界区的步骤如下:

    (1)初始化一个CRITICAL_SECTION结构;在使用临界区对象之前,需要定义全局CRITICAL_SECTION变量,在调用CreateThread函数前调用InitializeCriticalSection函数初始化临界区对象;

    (2)申请进入一个临界区;在线程函数中要对保护的数据进行操作前,可以通过调用EnterCriticalSection函数申请进入临界区。由于同一时间内只能有一个线程进入临界区,所以在申请的时候如果有一个线程已经进入临界区,则该函数就会一直等到那个线程执行完临界区代码;

    (3)离开临界区;当执行完临界区代码后,需要调用LeaveCriticalSection函数离开临界区;

    (4)删除临界区;当不需要临界区时调用DeleteCriticalSection函数将临界区对象删除;

    下面的代码创建了5个线程,每个线程在文件中写入10000个“hello”:

    [cpp]  view plain  copy
    1. #include <stdio.h>  
    2. #include <windows.h>  
    3. HANDLE hFile;  
    4. CRITICAL_SECTION cs;//定义临界区全局变量  
    5. //线程函数:在文件中写入10000个hello  
    6. DWORD WINAPI Thread(LPVOID lpParam)  
    7. {  
    8.     int n = (int)lpParam;  
    9.     DWORD dwWrite;  
    10.     for (int i = 0;i < 10000;i++)  
    11.     {  
    12.         //进入临界区  
    13.         EnterCriticalSection(&cs);  
    14.         char data[512] = "hello\r\n";  
    15.         //写文件  
    16.         WriteFile(hFile, data, strlen(data), &dwWrite, NULL);  
    17.         //离开临界区  
    18.         LeaveCriticalSection(&cs);  
    19.     }  
    20.     printf("Thread #%d returned successfully\n", n);  
    21.     return 0;  
    22. }  
    23. int main()  
    24. {  
    25.     char *filename = "hack.txt";  
    26.     WCHAR name[20] = { 0 };  
    27.     MultiByteToWideChar(CP_ACP, 0, filename, strlen(filename) + 1, name, sizeof(name) / sizeof(name[0]));  
    28.     //创建文件  
    29.     hFile = CreateFile(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);  
    30.     if (hFile == INVALID_HANDLE_VALUE)  
    31.     {  
    32.         printf("CreateFile error.\n");  
    33.         return 0;  
    34.     }  
    35.     DWORD ThreadID;  
    36.     HANDLE hThread[5];  
    37.     //初始化临界区  
    38.     InitializeCriticalSection(&cs);  
    39.     for (int i = 0;i < 5;i++)  
    40.     {  
    41.         //创建线程,并调用Thread写文件  
    42.         hThread[i] = CreateThread(NULL, 0, Thread, (LPVOID)(i + 1), 0, &ThreadID);  
    43.         printf("Thread #%d has been created successfully.\n", i + 1);  
    44.     }  
    45.     //等待所有进程结束  
    46.     WaitForMultipleObjects(5, hThread, TRUE, INFINITE);  
    47.     //删除临界区  
    48.     DeleteCriticalSection(&cs);  
    49.     //关闭文件句柄  
    50.     CloseHandle(hFile);  
    51.     return 0;  
    52. }  
    结果如图:





    2:CreateThread, AfxBeginThread,_beginthread, _beginthreadex的区别

    转载自:http://blog.csdn.net/qq_16149777/article/details/51910836

    1、CreateThread——Windows的API函数
    2、_beginthreadex——MS对C Runtime库的扩展SDK函数

    3、AfxBeginThread——MFC中线程创建的MFC函数


    【参考1】CreateThread, AfxBeginThread,_beginthread, _beginthreadex的区别 =====================================================================


    1、CreateThread——Windows的API函数
    2、_beginthreadex——MS对C Runtime库的扩展SDK函数
    3、AfxBeginThread——MFC中线程创建的MFC函数


    CreateThread
    (API函数:SDK函数的标准形式,直截了当的创建方式,任何场合都可以使用。)
    提供操作系统级别的创建线程的操作,且仅限于工作者线程。不调用MFC和RTL的函数时,可以用CreateThread,其它情况不要轻易。在使用的过程中要考虑到进程的同步与互斥的关系(防止死锁)。
    线程函数定义为:DWORD WINAPI _yourThreadFun(LPVOID pParameter)。
    但它没有考虑:
    (1)C Runtime中需要对多线程进行纪录和初始化,以保证C函数库工作正常(典型的例子是strtok函数)。
    (2)MFC也需要知道新线程的创建,也需要做一些初始化工作(当然,如果没用MFC就没事了)。  


    _beginthreadex
    MS对C Runtime库的扩展SDK函数,首先针对C Runtime库做了一些初始化的工作,以保证C Runtime库工作正常。然后,调用CreateThread真正创建线程。 仅使用Runtime Library时,可以用_BegingThread。


    AfxBeginThread
    MFC中线程创建的MFC函数,首先创建了相应的CWinThread对象,然后调用CWinThread::CreateThread,   在CWinThread::CreateThread中,完成了对线程对象的初始化工作,然后,调用_beginthreadex(AfxBeginThread相比较更为安全)创建线程。它简化了操作或让线程能够响应消息,即可用于界面线程,也可以用于工作者线程,但要注意不要在一个MFC程序中使用_beginthreadex()或CreateThread()。
    线程函数定义为:UINT _yourThreadFun(LPVOID pParam)


    =====================================================================






    【参考2】CreateThread与_beginthreadex
    =====================================================================


    CreateThread
    “CreateThread函数是用来创建线程的Windows函数不过,如果你正在编写C/C++代码,决不应该调用CreateThread。相反,应该使用Visual C++运行期库函数_beginthreadex。如果不使用Microsoft的Visual C++编译器,你的编译器供应商有它自己的CreateThred替代函数。不管这个替代函数是什么,你都必须使用。”


    _beginthreadex
    "_beginthreadex函数的参数列表与CreateThread函数的参数列表是相同的,但是参数名和类型并不完全相同。这是因为 Microsoft的C/C++运行期库的开发小组认为, C/C++运行期函数不应该对Windows数据类型有任何依赖。_beginthreadex函数也像CreateThread那样,返回新创建的线程的句柄。因此,如果调用源代码中的CreateThread,就很容易用对_beginthreadex的调用全局取代所有这些调用。不过,由于数据类型并不完全相同,所以必须进行某种转换,使编译器运行得顺利些。" 
    "下面是关于_beginthreadex的一些要点: 
    1) 每个线程均获得由C/C++运行期库的堆栈分配的自己的tiddata内存结构。(tiddata结构位于Mtdll.h文件中的Visual C++源代码中)。 
    2) 传递给_beginthreadex的线程函数的地址保存在tiddata内存块中。传递给该函数的参数也保存在该数据块中。 
    3) _beginthreadex确实从内部调用CreateThread,因为这是操作系统了解如何创建新线程的唯一方法。 
    4) 当调用CreatetThread时,它被告知通过调用_threadstartex而不是pfnStartAddr来启动执行新线程。还有,传递给线程函数的参数是tiddata结构而不是pvParam的地址。 
    5) 如果一切顺利,就会像CreateThread那样返回线程句柄。如果任何操作失败了,便返回NULL。"


    为什么?
      “也许你想知道,如果调用CreateThread,而不是调用C/C++运行期库的_beginthreadex来创建新线程,将会发生什么情况。当一个线程调用要求tiddata结构的C/C++运行期库函数时,将会发生下面的一些情况(大多数C/C++运行期库函数都是线程安全函数,不需要该结构)。
      首先,C/C++运行期库函数试图(通过调用TlsGetValue)获取线程的数据块的地址。如果返回NULL作为tiddata块的地址,调用线程就不拥有与该地址相关的tiddata块。这时,C/C++运行期库函数就在现场为调用线程分配一个tiddata块,并对它进行初始化。然后该 tiddata块(通过TlsSetValue)与线程相关联。此时,只要线程在运行,该tiddata将与线程待在一起。这时,C/C++运行期库函数就可以使用线程的tiddata块,而且将来被调用的所有C/C++运行期函数也能使用tiddata块。 
      当然,这看来有些奇怪,因为线程运行时几乎没有任何障碍。不过,实际上还是存在一些问题。首先,如果线程使用C/C++运行期库的signal函数,那么整个进程就会终止运行,因为结构化异常处理帧尚未准备好。第二,如果不是调用_endthreadex来终止线程的运行,那么数据块就不会被撤消,内存泄漏就会出现(那么谁还为使用CreateThread函数创建的线程来调用_endthreadex呢?)。 
       注意如果程序模块链接到多线程DLL版本的C/C++运行期库,那么当线程终止运行并释放tiddata块(如果已经分配了tiddata块的话)时,该运行期库会收到一个DLL_THREAD_DETACH通知。尽管这可以防止tiddata块的泄漏,但是强烈建议使用_beginthreadex而不是使用Createthread来创建线程。


    =====================================================================






    【参考3】关于_beginthreadex和CreateThread的区别
    =====================================================================


      在 Win32 API 中,创建线程的基本函数是 CreateThread,而 _beginthread(ex) 是C++ 运行库的函数。为什么要有两个呢?因为C++ 运行库里面有一些函数使用了全局量,如果使用 CreateThread 的情况下使用这些C++ 运行库的函数,就会出现不安全的问题。而 _beginthreadex 为这些全局变量做了处理,使得每个线程都有一份独立的“全局”量。
      所以,如果你的编程只调用 Win32 API/SDK ,就放心用 CreateThread;如果要用到C++ 运行时间库,那么就要使用 _beginthreadex ,并且需要在编译环境中选择 Use MultiThread Lib/DLL。
      通常他们的解释都是这容易造成内存泄漏。这个解释本身是没有错的,但是解释得不够完全和详细。以至于造成很多新手盲目的信任了那句话,在那里都是用_beginthreadex函数,或者是装作没有看到使用CreateThread函数。曾经有一段时间我也对这个问题很是困惑,不知道到底用那个才是对的。因为我不止一次在很多权威性的代码中看到对CreateThread函数的直接调用。难道是权威错了?? 抱着怀疑的态度查找了大量的资料和书籍,终于搞明白了这个问题的关键所在,在此做个说明,算是对那句话的一个完善。
      关于_beginthreadex和CreateThread的区别我就不做说明了,这个很容易找到的。我们只要知道一个问题:_beginthreadex是一个C运行时库的函数,CreateThread是一个系统API函数,_beginthreadex内部调用了CreateThread。只所以所有的书都强调内存泄漏的问题是因为_beginthreadex函数在创建线程的时候分配了一个堆结构并和线程本身关联起来,我们把这个结构叫做tiddata结构,是通过线程本地存储器TLS于线程本身关联起来。我们传入的线程入口函数就保存在这个结构中。tiddata的作用除了保存线程函数入口地址之外,还有一个重要的作用就是:C运行时库中有些函数需要通过这个结构来保存和获取一些数据,比如说errno之类的线程全局变量。这点才是最重要的。
      当一个线程调用一个要求tiddata结构的运行时库函数的时候,将发生下面的情况:
      运行时库函数试图TlsGetv alue获取线程数据块的地址,如果没有获取到,函数就会现场分配一个 tiddata结构,并且和线程相关联,于是问题出现了,如果不通过_endthreadex函数来终结线程的话,这个结构将不会被撤销,内存泄漏就会出现了。但通常情况下,我们都不推荐使用_endthreadex函数来结束线程,因为里面包含了ExitThread调用。
      找到了内存泄漏的具体原因,我们可以这样说:只要在创建的线程里面不使用一些要求tiddata结构的运行时库函数,我们的内存时安全的。所以,前面说的那句话应该这样说才完善:
      “绝对不要调用系统自带的CreateThread函数创建新的线程,而应该使用_beginthreadex,除非你在线程中绝不使用需要tiddata结构的运行时库函数”
      这个需要tiddata结构的函数有点麻烦了,在侯捷的《win32多线程程序设计》一书中这样说到:
       如果在除主线程之外的任何线程中进行一下操作,你就应该使用多线程版本的C runtime library,并使用_beginthreadex和_endthreadex:
       1 使用malloc()和free(),或是new和delete
       2 使用stdio.h或io.h里面声明的任何函数
       3 使用浮点变量或浮点运算函数
       4 调用任何一个使用了静态缓冲区的runtime函数,比如:asctime(),strtok()或rand()




    =====================================================================








    【参考4】_beginthreadex、CreateThread、AfxBeginThread的选择=====================================================================


    1. Create/EndThread是Win32方法开始/结束一个线程
    _beginthreadx/_endthreadex是C RunTime方式开始/结束一个线程
    AfxBeginThread在MFC中开始/结束一个线程


    2.直接在CreateThread API创建的线程中使用sprintf,malloc,strcat等涉及CRT存储堆操作的CRT库函数是很危险的,容易造成线程的意外中止。 在使用_beginthread和_beginthreadex创建的线程中可以安全的使用CRT函数。但是必须在线程结束的时候相应的调用_endthread或_endthreadex


    3._beginthread成对调用的_endthread函数内部隐式的调用CloseHandle关闭了线程句柄,而与_beginthreadex成对使用的_endthreadex则没有关闭线程的句柄,需要显示的调用CloseHandle关闭线程句柄,不要使用_beginthread,使用._beginthreadex代替之。


    4.尽量不要在一个MFC程序中使用_beginthreadex()或CreateThread()。


    5.没有使用到MFC的线程尽量用_beginthreadex启动。


    6.如果在一个与LIBCMT.LIB链接的程序中调用C Runtime函数,则必须要用_beginthreadex启动线程


    7._beginthreadex启动的线程可以安全的调用任何C Runtime 函数


    =====================================================================






    【参考5】CreateThread()、_beginthread()以及_beginthreadex()联系与区别
    =====================================================================


    <<Windows核心编程>>中有很详细地介绍:
    注意:若要创建一个新线程,绝对不要使用CreateThread,而应使用_beginthreadex.
    Why?考虑标准C运行时库的一些变量和函数,如errno,这是一个全局变量。全局变量用于多线程会出什么事,你一定知道的了。故必须存在一种机制,使得每个线程能够引用它自己的errno变量,又不触及另一线程的errno变量._beginthreadex就为每个线程分配自己的tiddata内存结构。该结构保存了许多像errno这样的变量和函数的值、地址(自己看去吧)。
    通过线程局部存储将tiddata与线程联系起来。具体实现在Threadex.c中有。   
    结束线程使用函数_endthreadex函数,释放掉线程的tiddata数据块。   
    CRT的函数库在线程出现之前就已经存在,所以原有的CRT不能真正支持线程,这导致我们在编程的时候有了CRT库的选择,在MSDN中查阅CRT的函数时都有:
      Libraries   
      LIBC.LIB   Single   thread   static   library,   retail   version     
      LIBCMT.LIB   Multithread   static   library,   retail   version     
      MSVCRT.LIB   Import   library   for   MSVCRT.DLL,   retail   version     

    这样的提示!








    展开全文
  • windows线程创建

    千次阅读 2018-02-07 16:20:23
    windows系统创建线程: (当然MFC、QT也有对应创建线程的接口函数) 1、使用windows API CreateThread创建线程: (不建议使用该接口创建线程)具体原因:...

    (本文章旨在个人回顾知识点)

    windows系统创建线程:

    (当然MFC、QT也有对应创建线程的接口函数)

    1、使用windows API CreateThread创建线程:

    (不建议使用该接口创建线程)具体原因:http://blog.csdn.net/hkwlg1314/article/details/49429925


    2、使用_beginThread创建线程:

    ①头文件:#include<process.h>

    ②函数原型:

    _CRTIMP uintptr_t __cdecl _beginthread

     (

    _In_ void (__cdecl * _StartAddress) (void *), //线程调用的函数的起始地址

    _In_ unsigned _StackSize,      //新线程的栈大小,0为默认

    _In_opt_ void * _ArgList     //线程执行函数的参数

    );

    ③返回值为线程句柄

    简单列子:

    #include <process.h>
    #include <windows.h>
    #include <iostream>
    using namespace std;
    
    void threadFun(void* param)
    {
    	cout << "这是子线程!" << endl;
    	return;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	HANDLE threadHandle = (HANDLE)_beginthread(threadFun, 0, NULL);
    	if ((HANDLE)-1 == threadHandle)
    	{
    		cout << "创建线程失败!(牛B了你)" << endl;
    	}
    
    	cout << "这是主线程!" << endl;
    	system("pause");
    	return 0;
    }



    下面内容引用:http://blog.csdn.net/stven_king/article/details/50353628

    3、_beginthreadex和_beginthread

          (1)_beginthreadex内部会自动调用 _endthreadex.

          (2)_beginthread内部会自动调用_endthread.              

          (3)_endthread内部会自动调用CloseHandle关闭当前Thread内核对象的句柄,所以在用_beginthread 时我们不需要在主线程中调用CloseHandle来关闭子线程的句柄。 

        (4)_endthreadex相比_endthread而言更安全。它不会自动关闭当前Thread内核对象的句柄。所以在用_beginthreadex时我们需要用CloseHandle来关闭子线程的句柄。



    展开全文
  • windows API 线程创建

    2017-10-20 10:56:10
    使用Windows中提供的API创建线程,并在多线程中分别控制各自线程做不通的处理
  • windows创建线程编程

    千次阅读 2016-12-29 19:53:00
    程序从其主线程开始执行,这个主执行绪是在传统的C程序中叫做main的函数,而在Windows中是WinMain。一旦执行起来,程序可以通过在系统呼叫CreateThread中指定初始线程函数的名称来建立新的线程的执行。操作系统在...

    一个线程简单地被表示为可能呼叫程序中其它函数的函数。程序从其主线程开始执行,这个主执行绪是在传统的C程序中叫做main的函数,而在Windows中是WinMain。一旦执行起来,程序可以通过在系统呼叫CreateThread中指定初始线程函数的名称来建立新的线程的执行。操作系统在执行绪之间优先权式地切换控件,和它在程序之间切换控制权的方法非常类似。

    多线程,使程序得以将其工作分开,独立运作,互不影响。

    那么如何创建一个线程呢?

    代码如下:

    //最简单的创建多线程实例  
    #include <stdio.h>  
    #include <windows.h>  
    //子线程函数  
    DWORD WINAPI ThreadFun(LPVOID pM)  
    {  
    	printf("子线程的线程ID号为:%d\n子线程输出Hello World\n", GetCurrentThreadId());  
    	printf("然后开始休眠 \n");
    	Sleep(5000);
    	printf("线程唤醒 \n");
    	return 0;  
    }  
    
    
    DWORD WINAPI ThreadConsumer(LPVOID pM)
    {
    	printf("创建了一个消费者子线程,线程代号: %d \n", GetCurrentThreadId());
    	return 0;
    }
    
    
    DWORD WINAPI ThreadProductor(LPVOID pM)
    {
    	printf("创建了一个生产者子线程,线程代号: %d \n", GetCurrentThreadId());
    	return 0;
    }
    
    
    //主函数,所谓主函数其实就是主线程执行的函数。  
    int main()  
    {  
    	HANDLE handleThreadFun = CreateThread(NULL, 0, ThreadFun, NULL, 0, NULL);  	
    	
     	HANDLE handle = CreateThread(NULL, 0, ThreadProductor,NULL,0,NULL);
    	printf("Wait handleThreadFun start \n");
    	WaitForSingleObject(handleThreadFun, INFINITE); 
    	printf("Wait handleThreadFun end \n");
    	getchar();
    	return 0;  
    }  



    执行效果如下:


    展开全文
  • windows线程创建线程处理函数

    千次阅读 2017-10-31 20:34:40
    近期工作中用到了Windows中的线程创建函数,实例代码如下: #include #include #include #include using namespace std; //声明了两个线程处理函数 DWORD WINAPI Fun1Proc(LPVOID lpParameter); DWORD WINAPI ...

    近期工作中用到了Windows中的线程创建函数,实例代码如下:

    #include <QCoreApplication>
    #include <windows.h>
    #include <iostream>
    #include <windef.h>
     
    
    using namespace std;
    //声明了两个线程处理函数
    DWORD WINAPI Fun1Proc(LPVOID lpParameter);
    DWORD WINAPI Fun2Proc(LPVOID lpParameter);
    //公有变量作为共享资源
    int tickets=100;
    //互斥锁句柄
    HANDLE hMutex;
     
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
        HANDLE hThread1;
        HANDLE hThread2;
        //创建互斥锁
        hMutex=CreateMutex(NULL,FALSE,NULL);
        //使用CreateThread函数创建线程hThread1和hThread2
        hThread1=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Fun1Proc,NULL,0,NULL);
        hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
     
    
        while(true)
        {
            //主线程在互斥锁中出售火车票
            WaitForSingleObject(hMutex,INFINITE);
            if(tickets>0)
                cout<<"main thread sell ticket:"<<tickets--<<endl;
            else
                break;
            ReleaseMutex(hMutex);
        }
        return 0;
        //销售完火车票后关闭两个子线程
        CloseHandle(hThread1);
        CloseHandle(hThread2);
     
    
        Sleep(4000);
        return a.exec();
    }
     
    
    //线程hThread1的线程处理函数
    DWORD WINAPI Fun1Proc(LPVOID lpParameter)
    {
        while(true)
        {
            WaitForSingleObject(hMutex,INFINITE);
            if(tickets>0)
                cout<<"thread1 sell ticket:"<<tickets--<<endl;
            else
                break;
            ReleaseMutex(hMutex);
        }
        return 0;
    }
    //线程hThread2的线程处理函数
    DWORD WINAPI Fun2Proc(LPVOID lpParameter)
    {
        while(true)
        {
            WaitForSingleObject(hMutex,INFINITE);
            if(tickets>0)
                cout<<"thread2 sell ticket:"<<tickets--<<endl;
            else
                break;
            ReleaseMutex(hMutex);
        }
        return 0;
    }
     
    


    展开全文
  • 利用API在Windows下创建进程和线程 前言: 谈到在Windows创建线程的例子在网上的很多的参考都是基于MFC的其实就操作系统实验这个前提而言大可不必去碰那个大型的MFC的框架在Windows命令控制台下可创建进程及线程做些...
  • 在项目开发,乃至面试,都会用到多线程技术,windows提供了多线程开发的一系列API函数,各个函数的使用有些小的知识点如果不在意很容易出问题。趁着有时间,总结自己的一些使用记录及感受,如果博友看到本文,有不当...
  • windows 创建线程

    2012-07-17 15:50:00
    微软在Windows API中提供了建立新的线程的函数CreateThread,函数的原型定义如下: HANDLE CreateThread(  LPSECURITY_ATTRIBUTES lpThreadAttributes, //线程安全属性  DWORD dwStackSize, //堆栈大小 ...
  • 线程概述理解Windows内核对象线程是系统内核对象之一。在学习线程之前,应先了解一下内核对象。内核对象是系统内核分配的一个内存块,该内存块描述的是一个数据结构,其成员负责维护对象的各种信息。内核对象的数据...
  • Windows线程创建与撤销 操作系统实验
  • Windows 线程创建方式的比较

    千次阅读 2016-07-14 13:08:53
    进行 Windows 编程时,常需要涉及多线程编程,以下是 Windows 提供的关于创建线程的3个API。
  • windows系统中创建线程的函数有以下几个方法: CreadThread,AfxBeginThread,_beginthread,_beginthreadex。 一、CreateThread HANDLE WINAPI CreateThread( __in LPSECURITY_ATTRIBUTES lpThreadAttributes, ...
  • windows下,C语言创建线程

    千次阅读 2018-04-26 16:23:34
    1、使用CreateThread()、ExitThread(0)等系统调用创建和撤销线程#include "stdafx.h" #include "线程控制.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char ...
  • Windows创建线程的函数:CreateThread();该函数的原型声明如下: HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, ...
  • HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpsa,   DWORD cbStack,   LPTHREAD_START_ROUTINE lpStartAddr,   LPVOID lpvThreadParam, ...一、这个函数创建一个线程在调用进程的地址
  • windows创建线程有CreateThread _beginthreadex两个函数,起始_beginthreadex函数是CreateThread的封装,使用createthread容易造成内存泄露,一般不推荐使用,推荐使用_beginthreadex函数来创建线程。而mfc下推荐...
  • windows下c创建线程

    千次阅读 2012-03-13 22:10:23
    /************************************************************************/ ///unsigned long _beginthreadex( void *security, //Security descriptor for new thread; must be NULL for Windows 95 appli
  • windows线程线程资源创建与释放

    千次阅读 2016-12-02 15:19:54
    线程资源释放
  • windows的环境下,创建一个控制台进程,此进程创建两个并发线程,一个是读线程,另一个是写线程。这两个线程共享一个数组A,写线程对数组分别进行10次写操作,每次写操作对A的每个元素赋一个相同的值;读线程对数组...
  • windows系统中创建线程常用哪几个函数? 在windows系统中创建线程的函数有: CreadThread,AfxBeginThread,_beginthread,_beginthreadex。 他们的区别在于使用的场景不同。 CreateThread是Windows的API函数...
  • windows核心编程-创建线程CreateThread

    千次阅读 2016-11-30 19:21:28
    1、在Windows平台上,最终可以利用CPU执行代码的最小尸体就是线程 2、首先从内核角度看,线程是一个内核对象,系统用它来村塾一些关于线程统计信息(比如时间) 3、从编程角度来看,线程是一堆寄存器状态以及线程...
  • Windows线程创建和终止

    千次阅读 2012-06-05 13:06:40
     CreateThread是Windows的API函数,提供操作系统级别的创建线程的操作,且仅限于工作者线程。不调用MFC和RTL的函数时,可以用CreateThread,其它情况不要轻易。在使用的过程中要考虑到进程的同步与互斥的关系(防止...
  • 创建线程

    千次阅读 2011-01-10 20:24:00
    基于windows操作系统,可以采用如下函数创建线程: 1、windows API CreateThread; 2、C运行时库函数 _beginthreadex; 3、MFC接口函数AfxBeginThread;
  • 一、引言  接下来,笔者主要谈下Windows平台下多线程的用法。首先,要强调一点,Windows平台的线程linux中的线程不同,它会... CreateThread是Windows的API函数,提供操作系统级别的创建线程的操作,且仅限于工作者线
  • 线程创建 回收 windows linux系统都可使用
  • Windows线程总结(1)-- 线程创建

    千次阅读 2015-11-27 16:17:59
    创建线程我们需要使用CreateThread函数来完成, HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,//SD SIZE_T dwStackSize,//initialstacksize LPTHREAD_START_ROUTINE lpStartAddress,//thread...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 268,437
精华内容 107,374
关键字:

windows创建线程