当使用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
)
上面的代码是否会创建两个具有相同功能的线程(因为两个线程的线程过程相同。)我是否正确地执行了此操作?
如果可能,则会出现任何同步问题,因为两个线程都使用相同的线程过程。
请帮我解决这个问题。我真的很困惑,在互联网上找不到任何东西。
答案 0 :(得分:6)
使用相同的函数作为多个线程的线程入口点是可以的。
但是,从发布的代码中,i
的地址被传递给两个线程。如果任一线程修改此内存而另一个线程读取,则i
上存在竞争条件。没有看到i
的声明,它可能是一个局部变量。这很危险,因为线程要求i
在其生命周期内存在。如果i
没有,则线程将有一个悬空指针。通常的做法是动态分配线程参数并让每个线程释放其参数。
答案 1 :(得分:5)
是的,很可能有多个(并发)线程以相同的入口点开头。 除了OS /线程库指定签名并调用它之外,线程入口点函数没有什么特别之处。它可以用来启动多个线程,但需要注意从多个线程调用任何其他函数:您需要同步才能访问非原子共享变量。
每个线程使用自己的堆栈区域,但是在调用线程过程之前由OS分配,因此在调用线程过程时,创建和启动新线程所需的所有特殊操作已经完成发生了。
答案 2 :(得分:4)
线程是否使用相同的代码是无关紧要的。它对同步没有任何影响。它的行为与它们不同的功能完全相同。潜在比赛的问题是一样的。
您可能不希望将两个线程传递给相同的指针。这可能会导致数据竞争。 (虽然我们必须看到代码才能确定。)
答案 3 :(得分:2)
你的代码是对的。两个线程之间没有任何同步问题。如果他们需要同步,可能是因为他们改变了相同的全局变量,而不是因为他们使用相同的线程过程。