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

Ays*_*yse 0 c windows winapi multithreading 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
                            ) 
Run Code Online (Sandbox Code Playgroud)

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

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

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

hmj*_*mjd 6

可以将相同的函数用作多个线程的线程入口点.

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


Bar*_*nau 5

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

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