两个线程可以使用同一个线程过程吗?



是否有可能两个线程使用单个函数"ThreadProc"作为其线程过程时使用CreateThread() ?

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
                            ) 

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

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

请帮我一下。我真的很困惑,在网上找不到任何东西。

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

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

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

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

线程是否使用相同的代码是不相关的。它对同步没有任何影响。它的行为完全一样,就好像它们是不同的函数一样。潜在竞争的问题也是一样的。

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

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

最新更新