两个线程可以使用相同的线程过程吗?
Posted
技术标签:
【中文标题】两个线程可以使用相同的线程过程吗?【英文标题】:Can two Threads use same Thread Procedure? 【发布时间】:2013-05-02 08:20:40 【问题描述】:当使用 CreateThread() 时,两个线程是否可以使用单个函数“ThreadProc”作为其线程过程?
HANDLE thread1= CreateThread( NULL, //Choose default security
0, //Default stack size
(LPTHREAD_START_ROUTINE)&ThreadProc,
//Routine to execute. I want this routine to be different each time as I want each thread to perform a different functionality.
(LPVOID) &i, //Thread parameter
0, //Immediately run the thread
&dwThreadId //Thread Id
)
HANDLE thread2= CreateThread( NULL, //Choose default security
0, //Default stack size
(LPTHREAD_START_ROUTINE)&ThreadProc,
//Routine to execute. I want this routine to be different each time as I want each thread to perform a different functionality.
(LPVOID) &i, //Thread parameter
0, //Immediately run the thread
&dwThreadId //Thread Id
)
上面的代码会创建两个线程,每个线程都有相同的功能(因为两个线程的线程过程是相同的。)我做对了吗?
如果可能的话,由于两个线程都使用相同的线程过程,所以会有任何同步问题。
请帮我解决这个问题。我真的很困惑,在互联网上找不到任何东西。
【问题讨论】:
从这里开始:en.wikipedia.org/wiki/Thread_(computing) 您的第二个线程 id 将覆盖第一个。如果您不关心线程 ID,只需传递NULL
。如果您关心,请使用dwThreadId1
和dwThreadId2
(当然也可以使用数组)。
清除您同时询问的How to create multiplethreads each with different ThreadProc() function using CreateThread() 的副本。
移除那些演员表(通常所有演员表),它们只是用来隐藏错误。只要它们具有正确的类型,您就不需要将函数指针转换为入口函数或上下文指针。如果他们不这样做,请修复它。
【参考方案1】:
可以将同一个函数用作多个线程的线程入口点。
但是,从发布的代码中,i
的地址被传递给两个线程。如果任何一个线程修改了这个内存并且另一个读取了,那么在i
上有一个竞争条件。没有看到i
的声明,它可能是一个局部变量。这是危险的,因为线程要求i
在其生命周期中存在。如果i
没有,线程将有一个悬空指针。通常的做法是动态分配线程参数并让每个线程释放其参数。
【讨论】:
@AyeshaHassan,不要在回答答案时编辑问题。这会使后来提出问题的人感到困惑,并使发布的答案显得不正确或无用。建议搜索与“传递线程参数”相关的问题或发布新问题。 我明白了。非常感谢您的解释。【参考方案2】:是的,很有可能有多个(并发)线程从同一个入口点开始。 除了操作系统/线程库指定签名并调用它这一事实之外,线程入口点函数并没有什么特别之处。它可用于启动多个线程,但需要注意从多个线程调用任何其他函数:您需要同步才能访问非原子共享变量。
每个线程都使用自己的堆栈区域,但在线程过程被调用之前由操作系统分配,所以当线程过程被调用时,创建和启动新线程所需的所有特殊操作已经发生了。
【讨论】:
【参考方案3】:线程是否使用相同的代码无关紧要。它对同步没有任何影响。它的行为完全相同,就好像它们是不同的功能一样。潜在种族的问题是相同的。
您可能不想向两个线程传递相同的指针。这可能会导致数据竞争。 (虽然我们必须看到代码才能确定。)
【讨论】:
【参考方案4】:您的代码是正确的。两个线程之间没有任何同步问题。如果他们需要同步,可能是因为他们改变了同一个全局变量,而不是因为他们使用了同一个线程过程。
【讨论】:
以上是关于两个线程可以使用相同的线程过程吗?的主要内容,如果未能解决你的问题,请参考以下文章