多线程CreateThread函数的用法及注意事项

转载 2015年07月07日 22:16:23
当使用CreateProcess调用时,系统将创建一个进程和一个主线程。CreateThread将在主线程的基础上创建一个新线程,大致做如下步骤:
  1在内核对象中分配一个线程标识/句柄,可供管理,由CreateThread返回
  2把线程退出码置为STILL_ACTIVE,把线程挂起计数置1
  3分配context结构
  4分配两页的物理存储以准备栈,保护页设置为PAGE_READWRITE,第2页设为PAGE_GUARD
  5lpStartAddr和lpvThread值被放在栈顶,使它们成为传送给StartOfThread的参数
  6把context结构的栈指针指向栈顶(第5步)指令指针指向startOfThread函数
语法:
  hThread = CreateThread(&security_attributes, dwStackSize, ThreadProc,pParam, dwFlags, &idThread) ;
HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes,      // pointer to security attributes
  DWORD dwStackSize,                  // initial thread stack size
  LPTHREAD_START_ROUTINE lpStartAddress,       // pointer to thread function
  LPVOID lpParameter,                   // argument for new thread
  DWORD dwCreationFlags,                // creation flags
  LPDWORD lpThreadId                  // pointer to receive thread ID
);
第一个参数是指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,它被设为NULL。
第二个参数是用于新线程的初始堆栈大小,默认值为0。在任何情况下,Windows根据需要动态延长堆栈的大小。
第三个参数是指向线程函数的指标。函数名称没有限制,但是必须以下列形式声明:
DWORD WINAPI ThreadProc (PVOID pParam) ;
第四个参数为传递给ThreadProc的参数。这样主线程和从属线程就可以共享数据。
第五个参数通常为0,但当建立的线程不马上执行时为旗标CREATE_SUSPENDED。线程将暂停直到呼叫ResumeThread来恢复线程的执行为止。
第六个参数是一个指标,指向接受执行绪ID值的变量。
 
注意:临界区要在线程执行前初始化,因为线程一但被建立即开始运行(除非手工挂起),但线程建立后在初始化临界区可能出现问题
如:孙鑫MFC中的现象
int main()

InitializeCriticalSection(&g_cs);//先初始化临界区


HANDLE handle1=CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);
HANDLE handle2=CreateThread(NULL,0,ThreadProc2,NULL,0,NULL);
CloseHandle(handle1); 
CloseHandle(handle2); 


Sleep(4000);
DeleteCriticalSection(&g_cs);
return 0; 
}

多线程 CreateThread 函数的用法及注意事项

当使用 CreateProcess 调用时,系统将创建一个进程和一个主线程。CreateThread 将在主线程的基础上创建一个新线程,大致做如下步骤: 在内核对象中分配一个线程标识 / ...
  • fuck51cto
  • fuck51cto
  • 2016年08月09日 23:39
  • 187

多线程CreateThread函数的用法及注意事项

原文出自:http://www.cnblogs.com/BeyondTechnology/archive/2010/08/30/1813082.html 转载请注明出处! 当使用CreateProc...
  • u014751358
  • u014751358
  • 2014年12月24日 16:31
  • 288

C++ 多线程 CreateThread函数使用例

C++ 多线程 CreateThread函数使用例
  • w442863748
  • w442863748
  • 2016年10月11日 10:03
  • 5453

【VS开发】CreateThread给线程函数传递的参数

CreateThread给线程函数传递的参数   HANDLE WINAPI CreateThread ( __in_opt LPSECURITY_ATTRI...
  • LG1259156776
  • LG1259156776
  • 2016年10月26日 16:40
  • 848

PostThreadMessage和SendMessage用法+结合CreateThread多线程讲解

PostThreadMessage和SendMessage用法+结合CreateThread多线程讲解
  • qq_19667153
  • qq_19667153
  • 2016年02月04日 18:49
  • 2138

多线程的使用与注意事项

主要介绍一下iPhone SDK中多线程的使用方法以及注意事项。虽然现在大部分PC应用程序都支持多线程/多任务的开发方式,但是在iPhone上,Apple并不推荐使用多线程的编程方式。但是多线程编程毕...
  • ljloving
  • ljloving
  • 2012年05月24日 16:53
  • 410

使用CreateThread函数创建线程

线程是进程中的一个实体,是被系统独立调度和分派的基本单位。一个进程可以拥有多个线程,但是一个线程必须有一个进程。线程自己不拥有系统资源,只有运行所必须的一些数据结构,但它可以与同属于一个进程的其它线程...
  • u012877472
  • u012877472
  • 2015年11月08日 21:00
  • 5064

C++多线程传参,CreateThread参数的使用方法

http://blog.csdn.net/beyondhaven/article/details/5096605 项目是VS2003下的,用到了CreateThread函数,看到网上...
  • mengzhengjie
  • mengzhengjie
  • 2015年06月26日 14:56
  • 2859

C++ 多线程之创建多线程CreateThread

一、为什么要写这篇博客一直对C++多线程一知半解,感觉没有实际进入过C++多线程的世界,因此想从头开始慢慢真正进入C++多线程,真正了解多线程。因为我也想了解Linux下的C++ 编程,因此我也会在L...
  • oLanSeFengYe1
  • oLanSeFengYe1
  • 2016年08月25日 17:18
  • 689

VC++6.0&&VS2008&MFC&API学习问题总结(一)(多线程CreateThread及小问题汇总)

以下资料部分收集于网络,部分是自己碰到的问题(内容将陆续更新): 1、VC++6.0无法设置断点:先关闭程序,然后删除目录下的.opt和.ncb文件,重新打开项目,就OK! 2、这个无奈问...
  • xuyuefei1988
  • xuyuefei1988
  • 2012年07月22日 21:58
  • 5155
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程CreateThread函数的用法及注意事项
举报原因:
原因补充:

(最多只允许输入30个字)