请教几种创建线程函数的区别

本文探讨了在Windows环境下创建线程的几种方法,包括CreateThread、_beginthreadex及AfxBeginThread等函数的区别。从系统级API到运行时库函数,详细解释了它们之间的调用关系和应用场景。

标  题: [合集] 请教几种创建线程函数的区别。

发信站: 水木社区 (Wed Oct 11 16:43:15 2006), 站内

☆─────────────────────────────────────☆ 

  zealotkuihua (葵花) 于  (Tue Oct  3 13:28:38 2006)  提到:

接触多线程编程有一段时间了。发现有多种创建线程的函数

1。 HANDLE WINAPI CreateThread(

  LPSECURITY_ATTRIBUTES lpThreadAttributes,

  SIZE_T dwStackSize,

  LPTHREAD_START_ROUTINE lpStartAddress,

  LPVOID lpParameter,

  DWORD dwCreationFlags,

  LPDWORD lpThreadId

);

2。uintptr_t _beginthread(

  void( __cdecl *start_address )( void * ),

  unsigned stack_size,

  void *arglist

);

uintptr_t _beginthreadex(

  void *security,

  unsigned stack_size,

  unsigned ( __stdcall *start_address )( void * ),

  void *arglist,

  unsigned initflag,

  unsigned *thrdaddr

);

3。CWinThread* AfxBeginThread(

  AFX_THREADPROC pfnThreadProc,

  LPVOID pParam,

  int nPriority = THREAD_PRIORITY_NORMAL,

  UINT nStackSize = 0,

  DWORD dwCreateFlags = 0,

  LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL

);

CWinThread* AfxBeginThread(

  CRuntimeClass* pThreadClass,

  int nPriority = THREAD_PRIORITY_NORMAL,

  UINT nStackSize = 0,

  DWORD dwCreateFlags = 0,

  LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL

);

这3种创建线程函数创建的线程有什么区别吗?

哪位大虾指点一下。

☆─────────────────────────────────────☆ 

  zealotkuihua (葵花) 于  (Wed Oct  4 13:51:22 2006)  提到:

难道我问错了版块?

【 在 zealotkuihua (葵花) 的大作中提到: 】                                     

: 接触多线程编程有一段时间了。发现有多种创建线程的函数                         

: 1。 HANDLE WINAPI CreateThread(                                             

:  LPSECURITY_ATTRIBUTES lpThreadAttributes,

: ...................                                                         

                                                                               

                                                                               

☆─────────────────────────────────────☆ 

  icubaby (不吃草的羊) 于  (Wed Oct  4 14:13:19 2006)  提到:

_beginthread and _beginthreadex are functions in std C library. _beginthreadex

is an extended version of _beginthread. CreateThread is a WINDOWS API, which

invoke _beginthreadex internally. AfxBeginThread is a global function in MFC,

which invokes CreateThread internally.

【 在 zealotkuihua (葵花) 的大作中提到: 】                                     

: 接触多线程编程有一段时间了。发现有多种创建线程的函数                         

: 1。 HANDLE WINAPI CreateThread(                                             

:  LPSECURITY_ATTRIBUTES lpThreadAttributes,                                 

: ...................

                                                                               

                                                                               

                                                                               

☆─────────────────────────────────────☆ 

  ftofficer (USTC::聪) 于  (Thu Oct  5 23:24:14 2006)  提到:

                                                                               

【 在 icubaby (不吃草的羊) 的大作中提到: 】                                   

: _beginthread is in std C library. _beginthreadex is an extended version of   

_beginthread.                                                                 

两者不是std C library的函数。

而是MS C Runtime扩展函数。

: CreateThread is a WINDOWS API, which invoke _beginthreadex internally.       

不是CreateThread调用_beginthreadex,而是_beginthreadex调用CreateThread.

: AfxBeginThread is a global function in MFC, which invokes Cr                 

: ...                                                                         

总体来说,CreateThread是Windows的API函数,提供操作系统级别的创建线程的操作。没有

太多额外的操作,直接调用到你的回调函数。_beginthreadex和_beginthread在回调入口函

数之前进行一些线程相关的CRT的初始化操作。AfxBeginThread内部调用了_beginthreadex

,并在此之前进行一些MFC相关的初始化工作。

                                                                               

                                                                               

                                                                               

☆─────────────────────────────────────☆ 

  bore (总有一些时候情绪比较低落|a za a za) 于  (Fri Oct  6 00:28:44 2006)  提?

                                                                               

错了吧.

_beginthread,_beginthreadex调CreateThread吧.

CreateThread某些时候有副作用而_beginthreadex没有,说明是_beginthreadex 调了

CreateThread

【 在 icubaby (不吃草的羊) 的大作中提到: 】                                   

: _beginthread and _beginthreadex are functions in std C library.             

_beginthreadex is an extended version of _beginthread. CreateThread is a       

WINDOWS API, which invoke _beginthreadex internally. AfxBeginThread is a global

function in MFC, which invokes CreateThread internally.                       

                                                                               

                                                                               

                                                                               

                                                                               

☆─────────────────────────────────────☆ 

  yennar (原云) 于  (Fri Oct  6 08:02:15 2006)  提到:

                                                                               

总之不管谁都回最终回到CreateThread

【 在 bore (总有一些时候情绪比较低落|a za a za) 的大作中提到: 】               

: 错了吧.                                                                     

: _beginthread,_beginthreadex调CreateThread吧.                                 

: CreateThread某些时候有副作用而_beginthreadex没有,说明是_beginthreadex 调了   

CreateThread                                                                   

                                                                               

                                                                               

                                                                               

                                                                               

                                                                               

☆─────────────────────────────────────☆ 

  wjie (faint) 于  (Fri Oct  6 11:22:34 2006)  提到:

如果一个线程自己卡死了,有办法在主线程里把它强行结束吗?how

                                                                               

【 在 yennar (原云) 的大作中提到: 】                                           

: 总之不管谁都回最终回到CreateThread                                           

                                                                               

                                                                               

                                                                               

                                                                               

☆─────────────────────────────────────☆ 

  yennar (原云) 于  (Fri Oct  6 18:45:39 2006)  提到:

TerminateThread

可以考虑“看门狗”的设计思路

                                                                               

【 在 wjie (faint) 的大作中提到: 】                                           

: 如果一个线程自己卡死了,有办法在主线程里把它强行结束吗?how 

 
当然可以!我来手把手教你写一个 **快速幂取模函数(Fast Modular Exponentiation)**,这是数论编程中最重要、最常用的函数之一。 --- ## 🎯 目标 我们要写一个函数,计算: $$ \text{result} = (base^{exp}) \mod m $$ 即使 $ base $ 和 $ exp $ 很大(比如 $ 2^{100000} \mod 1000003 $),也能**快速、准确**地算出来。 --- ## ✅ 正确的快速取模幂函数(C语言) ```c long long mod_exp(long long base, long long exp, long long mod) { long long result = 1; base %= mod; // 先对底数取模,防止 base 太大 while (exp > 0) { if (exp & 1) { // 如果 exp 是奇数(即二进制最后一位是1) result = (result * base) % mod; } base = (base * base) % mod; // 底数平方 exp = exp >> 1; // exp 除以 2(右移一位) } return result; } ``` --- ## 🔍 逐行解释 | 行数 | 代码 | 解释 | |------|------|------| | 1 | `long long mod_exp(...)` | 函数名,返回 long long 类型 | | 2 | `long long result = 1;` | 初始化结果为 1(因为任何数的 0 次幂是 1) | | 3 | `base %= mod;` | 防止 base 过大,先取模 | | 5 | `while (exp > 0)` | 当指数还没减完时继续循环 | | 6 | `if (exp & 1)` | 判断 `exp` 的二进制末位是否为 1(等价于 `exp % 2 == 1`) | | 7 | `result = (result * base) % mod;` | 把当前 base 乘入结果 | | 8 | `base = (base * base) % mod;` | 底数平方(准备下一轮) | | 9 | `exp >>= 1;` | 右移一位(相当于 `exp /= 2`) | --- ## 🧠 原理:二进制拆分指数 我们利用这个恒等式: $$ a^b = \begin{cases} (a^2)^{b/2}, & \text{if } b \text{ is even} \\ a \cdot (a^2)^{(b-1)/2}, & \text{if } b \text{ is odd} \end{cases} $$ 这样可以把指数不断缩小一半,时间复杂度从 $ O(b) $ 降到 $ O(\log b) $! --- ## ✅ 手动例子:计算 $ 2^5 \bmod 13 $ 目标:$ 2^5 = 32 \equiv 6 \pmod{13} $ | 步骤 | exp | exp&1? | result | base | 说明 | |------|-----|--------|--------|------|------| | 初始 | 5 | - | 1 | 2 | - | | 1 | 5 | 是(1) | (1×2)%13=2 | (2×2)%13=4 | result 更新,base 平方 | | 2 | 2 | 否(0) | 2 | (4×4)%13=3 | exp=1 | | 3 | 1 | 是(1) | (2×3)%13=6 | ... | 最后一次乘 | | 结束 | 0 | - | 返回 6 | - | ✅ 正确! | --- ## ⚠️ 注意事项 1. **必须每一步都 `% mod`** 否则 `base * base` 或 `result * base` 会溢出! 2. 使用 `long long` 防止中间结果溢出(但若 `mod > 1e9`,可能仍需 __int128 或其他技巧) 3. 不要用 `pow()`!它是浮点函数,精度丢失严重! --- ## 📝 如何使用这个函数? ```c #include <stdio.h> // 把上面的 mod_exp 函数粘贴在这里 int main() { long long base = 2; long long exp = 100; long long mod = 1000000007; long long ans = mod_exp(base, exp, mod); printf("%lld\n", ans); // 输出 2^100 mod 1000000007 return 0; } ``` --- ## 💡 小练习:你能写出下面的结果吗? 计算 $ 3^4 \bmod 5 $ 手动模拟一遍流程: - exp=4 → 二进制 `100` - 第一步:exp=4(偶)→ 不乘 result;base = 3² = 9%5=4 - 第二步:exp=2(偶)→ 不乘;base = 4²=16%5=1 - 第三步:exp=1(奇)→ result = 1×1 = 1 - 返回 1 ✅ 正确!因为 $ 3^4 = 81 \equiv 1 \pmod{5} $ --- ## ✅ 总结 你现在学会了如何写快速幂取模函数! | 要点 | 内容 | |------|------| | 函数名 | `mod_exp` | | 核心思想 | 二进制拆分指数 | | 时间复杂度 | $ O(\log \text{exp}) $ | | 关键操作 | `exp & 1`, `exp >>= 1`, 每步取模 | | 绝对禁止 | 使用 `pow()` 计算模幂 | --- 如果你想,我可以给你出几道练习题巩固一下 👍
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值