`

VC++ MSDN中的 _beginthreadex与_endthreadex 的使用例子

 
阅读更多
转自
http://blog.csdn.net/pacewalker/article/details/6947123

1._beginthread, _beginthreadex .
用于创建线程

uintptr_t _beginthread( 
   void( *start_address )( void * ),
   unsigned stack_size,
   void *arglist 
);
uintptr_t _beginthreadex( //推荐使用
   void *security, //安全属性,NULL为默认安全属性
   unsigned stack_size, //指定线程堆栈的大小。如果为0,则线程堆栈大小和创建它的线程的相同。一般用0
   unsigned ( *start_address )( void * ), //指定线程函数的地址,也就是线程调用执行的函数地址(用函数名称即可,函数名称就表示地址)
   void *arglist, //传给线程的参数指针;传多个参数时请用结构体 //可以通过传入对象的指针,在线程函数中再转化为对应类的指针
   unsigned initflag, //线程初始状态,0:立即运行;CREATE_SUSPEND:suspended(悬挂)
   unsigned *thrdaddr //用于记录线程ID的地址
);


参数:
start_address
Start address of a routine that begins execution of a new thread. For _beginthread, the calling convention is either __cdecl or __clrcall; for _beginthreadex, it is either__stdcall or __clrcall.
对于_beginthread,调用约定 是__cdecl或__clrcall; 对于_beginthreadex,则是either__stdcall或__clrcall。
stack_size
Stack size for a new thread or 0.
arglist
Argument list to be passed to a new thread or NULL.
security
Pointer to a SECURITY_ATTRIBUTES structure that determines whether the returned handle can be inherited by child processes. If NULL, the handle cannot be inherited. Must be NULL for Windows 95 applications.
initflag
Initial state of a new thread (0 for running or CREATE_SUSPENDED for suspended); use ResumeThread to execute the thread.
thrdaddr
Points to a 32-bit variable that receives the thread identifier. Might be NULL, in which case it is not used.

2._endthread, _endthreadex
用于关闭各个使用_beginthread or _beginthreadex创建的线程

void _endthread( void );
void _endthreadex( //推荐使用
   unsigned retval 
);



例子:

// crt_begthrdex.cpp
// compile with: /MT
#include <windows.h>
#include <stdio.h>
#include <process.h>


unsigned Counter; 
unsigned __stdcall SecondThreadFunc( void* pArguments )
{
    printf( "In second thread...\n" );


    while ( Counter < 1000000 )
        Counter++;


    _endthreadex( 0 );
    return 0;
} 


int main()
{ 
    HANDLE hThread;
    unsigned threadID;


    printf( "Creating second thread...\n" );


    // Create the second thread.
    hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc, NULL, 0, &threadID );


    // Wait until second thread terminates. If you comment out the line
    // below, Counter will not be correct because the thread has not
    // terminated, and Counter most likely has not been incremented to
    // 1000000 yet.
    WaitForSingleObject( hThread, INFINITE );
    printf( "Counter should be 1000000; it is-> %d\n", Counter );
    // Destroy the thread object.
    CloseHandle( hThread );
}


输出:

Creating second thread...
In second thread...
Counter should be 1000000; it is-> 1000000


一些比较具体的例子:
http://hi.baidu.com/qinpc/blog/item/5aaa8b54918e541b3a2935ee.html
http://www.cppblog.com/mzty/archive/2007/07/25/28756.html
分享到:
评论

相关推荐

    采用_beginthreadex创建多线程

    在C++环境中,我们通常会使用WinAPI函数`_beginthreadex`来创建线程,它是一个跨平台的线程创建方法,属于C运行时库(CRT)的一部分。本文将详细探讨如何使用`_beginthreadex`创建多线程以及其相关的知识点。 首先,...

    _beginthreadex与CreateThread区别

    在Windows编程中,创建线程是一项常见的任务,用于实现并发执行不同的任务。本文将深入探讨两种常见的线程创建函数:`CreateThread`和`_beginthreadex`,以及它们之间的本质区别。 `CreateThread`是Windows API提供...

    PostThreadMessage和_beginthreadex使用示例

    总的来说,理解并熟练掌握`_beginthreadex`、`PostThreadMessage`、`PeekMessage`和`WaitForSingleObject`的使用是Windows编程中的基础技能。它们对于构建高效、可靠的多线程应用程序至关重要,特别是当需要线程间的...

    CreateThread与_beginthreadex本质区别

    介绍了delphi中CreateThread与_beginthreadex本质区别。

    解决error C2065: '_beginthreadex' :undeclared identifier

    - 在源代码中使用`_beginthreadex`函数之前没有包含正确的头文件。 2. **编译器设置问题**: - 编译器配置不当,导致未能正确链接多线程运行库。 3. **链接库不正确**: - 项目链接到的不是支持多线程操作的运行...

    VC外部符号错误_main,_WinMain@16,__beginthreadex解决方法

    接下来,`unresolved external symbol __beginthreadex`和`unresolved external symbol __endthreadex`错误通常与线程创建有关,这可能是因为你的项目未正确配置为使用多线程运行时库。MFC在处理多线程时会依赖这些...

    Ado5.rar_Ado5_VC++ SQL _Vc_vc sql_并发

    2. **VC++与ADO集成**: 在VC++项目中使用ADO,首先需要包含相关的头文件,如`#include &lt;atlbase.h&gt;`和`#include &lt;atlcom.h&gt;`,并链接所需的库如msado15.lib。然后,我们可以创建`CComPtr`智能指针实例,用于安全地...

    catchscreenex_VC++源码_

    2. **Windows API**:VC++程序通常使用Windows API来与操作系统交互,比如获取鼠标和键盘输入、绘制图形、打开文件对话框等。开发者需要熟悉如`CreateWindow`、`GetMessage`、`DispatchMessage`等窗口消息处理函数。...

    深入分析多线程同步.doc

    与`CreateThread`不同,`_beginthreadex`会自动处理C运行时库的初始化和清理,使得线程可以安全地使用C运行时库的功能。此外,`_beginthreadex`还提供了更多的控制选项,比如线程优先级和安全属性等。 两者的主要...

    VC++多线程管理器_authornop_Vc_

    1. **线程创建**:在VC++中,可以使用`CreateThread`函数或`_beginthreadex`函数来创建新线程。这两个函数都需要传递一个函数指针,该指针指向新线程要执行的代码入口点。线程创建后,系统会为新线程分配资源,如栈...

    在您的线程函数中调用_endthreadex()是强制性的吗?

    _beginthreadex() 和 _endthreadex() 是两个与Win32线程相关的API函数,由Microsoft的C运行时库提供,用于在C++环境中创建和终止线程。本文将详细讨论在使用_beginthreadex() 创建线程后,是否必须显式调用_...

    203111101-陈舒埼-20软开2-实验3.doc

    在本实验中,我们将创建一个多线程程序,使用 `_beginthreadex` 函数创建一个线程,线程执行函数为 `Fun`。`Fun` 函数将不间断地循环,循环体首先在屏幕上输出字符串,然后休眠 500 毫秒。主函数 `main` 首先使用 `_...

    beginthread_和_CreateThread

    这两个函数都是在Windows编程环境中用于创建线程的重要手段,但它们在内部实现机制、资源管理以及与C运行时库(CRT)的交互方式上存在显著差异。下面将详细探讨这些知识点: ### _beginthread与CreateThread的核心...

    MFC线程创建之旅.pdf

    3. `CWinThread::CreateThread`使用_CRT的`_beginthreadex`函数创建线程,`_beginthreadex`是Windows API `CreateThread`的封装。 4. `_beginthreadex`内部调用了`_threadstartex`,这是一个线程启动函数,它使用了...

    VC++定时任务源码

    VC++中可以使用`CreateThread`或`_beginthreadex`创建新线程,同时需要理解线程同步和互斥量的概念,以确保线程安全。 3. **事件处理**:定时器触发时,通常会引发一个事件,需要编写对应的事件处理函数。VC++中...

    vc多线程的小例子

    在VC++编程环境中,多线程(Multithread)是一...总的来说,"vc多线程的小例子"为我们提供了一个学习和实践多线程编程的平台,通过这个例子,开发者可以更好地理解和掌握如何在VC++中构建高效、安全的多线程应用程序。

    VC6中MFC常见编译错误

    其次,是“LNK2001 on __beginthreadex and __endthreadex”链接错误。这是由于从VC3.0开始,MFC类库为了实现线程安全性,引入了Thread Local Storage (TLS)。当项目中包含了"MFC"类或使用了"MfcAppWizard"创建的...

    C++多线程编程

    2. **调用 `_endthreadex()` 或 `ExitThread()`**:虽然可以结束线程,但不建议这样做,因为它们可能不会正确清理堆栈或其他资源。 3. **调用 `TerminateThread()`**:这会立即终止线程,但可能导致数据损坏和资源未...

Global site tag (gtag.js) - Google Analytics