如何判断当前线程是否是主线程?

penguinhehe001 2010-03-26 02:11:10
如题
...全文
2031 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
majia2011 2012-07-13
  • 打赏
  • 举报
回复
看一下堆栈就知道了.................

估计是要杀东西,怕误伤吧
trollslinux 2012-07-13
  • 打赏
  • 举报
回复
试试签名
mymtom 2010-07-06
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 lthyxy 的回复:]
楼主都失踪了好bu?
[/Quote]
楼上终于升到星星了!
也不散分庆祝一下?
mymtom 2010-07-06
  • 打赏
  • 举报
回复
能取到主线程的id就可以了嘛!
liutengfeigo 2010-07-06
  • 打赏
  • 举报
回复

楼主都失踪了好bu?
Gary@Tokyo 2010-07-06
  • 打赏
  • 举报
回复
最一开始就记录线程ID

其他方法,木知
taodm 2010-07-06
  • 打赏
  • 举报
回复
我只好奇,楼主为啥需要这个功能?
「已注销」 2010-07-06
  • 打赏
  • 举报
回复
在程序启动时用一个全局变量保存当前线程句柄(可在main,winmain中)
要判断的地方用它和 GetCurrentThreadId 的返回值比较就好了
kuok2000 2010-07-06
  • 打赏
  • 举报
回复
如果一下线程是一个进程的主线程,那么一般情况这个线程是线程组的组长.
jufeibing 2010-06-27
  • 打赏
  • 举报
回复
BOOL IsMainThread()
{
return ::AfxGetApp()->m_nThreadID==GetCurrentThreadId();
}
tj_swjtu 2010-04-02
  • 打赏
  • 举报
回复
学习~~
penguinhehe001 2010-03-29
  • 打赏
  • 举报
回复
楼上说的好,我只熟悉Windows,加变量时一个思路,至少自己的程序可以解决,但是,假如我是一个模块,怎么办呢,通过各楼回答,好像不太可能呀
bobo364 2010-03-26
  • 打赏
  • 举报
回复
这帖子好,一发拿徽章的全来了

操作线程由操作系统调配,自己没法判断哪个是主线程,那个是子线程
yanran_hill 2010-03-26
  • 打赏
  • 举报
回复

static pthread_t g_nMainThreadID = 0xFFFFFFFF;

int main()
{
g_nMainThreadID = pthread_self();
...
}

bool IsMainThread()
{
return (g_nMainThreadID == pthread_self());
}
traceless 2010-03-26
  • 打赏
  • 举报
回复
unsiged int g_dwMainThread = 0;

int main()
{
g_dwMainThread = ::GetCurrentThreadId(); //主线程ID
....
_beginthreadex(NULL, 0, OtherProc, NULL, 0, &dwOtherThread); //
}

... OtherProc(...)
{
//或者 dwOtherThread = ::GetCurrentThreadId();
}

比较线程ID,等于g_dwMainThread就是呗
大熊猫侯佩 2010-03-26
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 mydo 的回复:]

WIN NT , try to :

A 比较线程存活时间,最少的是主线程

B 察看线程的TEB Address,最大的是主线程

C 寻找WIN32线程入口点(不是user线程入口点),与众不同的是主线程

D 如果有sym的话,检查当前栈回溯,如果有xxxBaseProcessStart类似的符号则是主线程

E 调试该线程,在CrxxxThread之类的线程上设条件断……
[/Quote]

A 笔误,较长的是...
大熊猫侯佩 2010-03-26
  • 打赏
  • 举报
回复
WIN NT , try to :

A 比较线程存活时间,最少的是主线程

B 察看线程的TEB Address,最大的是主线程

C 寻找WIN32线程入口点(不是user线程入口点),与众不同的是主线程

D 如果有sym的话,检查当前栈回溯,如果有xxxBaseProcessStart类似的符号则是主线程

E 调试该线程,在CrxxxThread之类的线程上设条件断点或trace,之后xxx

以上只是在ring3中的不完整方法,还有在ring0和rin3中的更WS的方法...

楼下的继续...
cattycat 2010-03-26
  • 打赏
  • 举报
回复
linux可以通过判断线程id的。
柯本 2010-03-26
  • 打赏
  • 举报
回复
什么平台?windows下面?

Win32 does not maintain parent-child relationships for threads.

你可用spy++,看一下线程,它没有父线程项,当然就没有办法判是否为主线程了
独孤过儿 2010-03-26
  • 打赏
  • 举报
回复
线程这东西本来在各种OS的实现就千差万别了,所以还是先限定一下OS再继续讨论吧
加载更多回复(11)

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧