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
                            ) 

上面的代码会创建两个线程,每个线程都具有相同的功能(因为两个线程的线程过程是相同的。)我做对了吗?

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

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

4

4 回答 4

6

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

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

于 2013-05-02T08:23:19.917 回答
5

是的,很有可能有多个(并发)线程从同一个入口点开始。除了操作系统/线程库指定签名并调用它这一事实之外,线程入口点函数并没有什么特别之处。它可用于启动多个线程,其警告与从多个线程调用任何其他函数相同:您需要同步才能访问非原子共享变量。

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

于 2013-05-02T08:27:11.220 回答
4

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

您可能不想向两个线程传递相同的指针。这可能会导致数据竞争。(尽管我们必须查看代码才能确定。)

于 2013-05-02T08:23:29.587 回答
2

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

于 2013-05-02T08:27:22.650 回答