两个线程可以使用相同的线程程序吗?

时间:2013-05-02 08:20:41

标签: c windows multithreading winapi thread-synchronization

当使用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
                            ) 

上面的代码是否会创建两个具有相同功能的线程(因为两个线程的线程过程相同。)我是否正确地执行了此操作?

如果可能,则会出现任何同步问题,因为两个线程都使用相同的线程过程。

请帮我解决这个问题。我真的很困惑,在互联网上找不到任何东西。

4 个答案:

答案 0 :(得分:6)

使用相同的函数作为多个线程的线程入口点是可以的。

但是,从发布的代码中,i的地址被传递给两个线程。如果任一线程修改此内存而另一个线程读取,则i上存在竞争条件。没有看到i的声明,它可能是一个局部变量。这很危险,因为线程要求i在其生命周期内存在。如果i没有,则线程将有一个悬空指针。通常的做法是动态分配线程参数并让每个线程释放其参数。

答案 1 :(得分:5)

是的,很可能有多个(并发)线程以相同的入口点开头。 除了OS /线程库指定签名并调用它之外,线程入口点函数没有什么特别之处。它可以用来启动多个线程,但需要注意从多个线程调用任何其他函数:您需要同步才能访问非原子共享变量。

每个线程使用自己的堆栈区域,但是在调用线程过程之前由OS分配,因此在调用线程过程时,创建和启动新线程所需的所有特殊操作已经完成发生了。

答案 2 :(得分:4)

线程是否使用相同的代码是无关紧要的。它对同步没有任何影响。它的行为与它们不同的功能完全相同。潜在比赛的问题是一样的。

您可能不希望将两个线程传递给相同的指针。这可能会导致数据竞争。 (虽然我们必须看到代码才能确定。)

答案 3 :(得分:2)

你的代码是对的。两个线程之间没有任何同步问题。如果他们需要同步,可能是因为他们改变了相同的全局变量,而不是因为他们使用相同的线程过程。