与“Thread”相关的TAG标签
SetTimer精度低(10–55ms),仅适用于UI刷新等非精确场景;高精度需用std::chrono+sleep_until、条件变量或QPC+WaitableTimer组合,注意系统时钟粒度与调度限制。
std::move仅是将左值转为右值引用的类型转换,不执行移动操作;它使移动构造/赋值函数得以调用,但若类型无移动语义或对象不可移动,则退化为拷贝。
Monitor.TryEnter需超时参数以防无限阻塞:超时为0即瞬时尝试,负数等价于无超时(不推荐),单位毫秒;其内部自旋由CLR自动控制且不可干预,需手动组合SpinWait与TryEnter(0)实现可控重试。
直接调用std::this_thread::get_id()获取当前线程ID,返回std::thread::id类型对象,支持比较和输出,但不可隐式转为整数或指针,也不能复制构造。
Dispatcher.Invoke同步执行会阻塞调用线程,适合需立即获取结果的场景;BeginInvoke异步但已过时;InvokeAsync是推荐方案,返回Task支持await,需注意线程上下文与异常处理。
lambda引用捕获会变悬空当其捕获的局部变量生命周期结束而lambda仍被调用,典型场景包括返回lambda、存入容器或注册为异步回调;关键在于被捕获变量的生命周期必须长于lambda。
.NET线程数无硬编码上限,实际受限于操作系统内存与内核对象;默认1MB栈空间导致32位进程约2000线程即OOM,64位受物理内存与页表限制;应优先使用async/await和ThreadPool而非手动创建大量Thread。
Dispose中禁止调用Thread.Abort(),应改用CancellationToken协同取消Task;需用Interlocked确保Dispose线程安全;IAsyncDisposable不解决并发问题,仅用于异步释放场景。
必须在join()或detach()前检查joinable(),否则触发未定义行为(如崩溃或std::terminate);joinable()仅表示线程对象关联活跃且未分离的执行线程,与线程函数是否完成无关。
std::function能代替函数指针但非无条件,它更通用却更重;仅当包装普通/静态函数且无捕获时可隐式转为函数指针,反之需显式构造;传参应据同步/异步场景选const引用或值传递。
