2013-05-02 175 views
0

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

从这里开始:http://en.wikipedia.org/wiki/Thread_(computing) – 2013-05-02 08:26:25

+1

你的第二个线程ID将覆盖第一个。如果你不关心线程ID,只需传递NULL即可。如果你在意,使用'dwThreadId1'和'dwThreadId2'(或者一个数组,当然)。 – MSalters 2013-05-02 11:07:33

+0

+1,谢谢:) – Ayse 2013-05-02 11:20:53

回答

6

使用与多个线程的线程入口点相同的函数是很好的。

但是,从发布的代码中,地址i正在传递给两个线程。如果其中一个线程修改了这个内存,另一个线程则在i上出现竞争条件。没有看到i的声明,它可能是一个局部变量。这是非常危险的,因为线程需要i一生存在。如果i不是线程将有一个悬挂指针。通常的做法是动态分配线程参数并让每个线程释放它的参数。

+0

编辑我的代码。现在请看一下:( – Ayse 2013-05-02 09:02:07

+0

@AyeshaHassan,不要编辑问题以回答问题,这会让后来出现问题的人感到困惑,并使得发布的答案显得不正确或无益。 “通过线程参数”或发布一个新问题 – hmjd 2013-05-02 09:04:21

+0

我明白了,非常感谢您的解释 – Ayse 2013-05-02 09:08:43

4

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

你可能不想让两个线程传递相同的指针。这可能会导致数据竞赛。 (虽然我们必须看到代码才能确定)

2

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

+0

非常感谢:) – Ayse 2013-05-02 09:01:18

5

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

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

相关问题