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)
上面的代码是否会创建两个具有相同功能的线程(因为两个线程的线程过程是相同的.)我是否正确地执行了此操作?
如果可能,则会出现任何同步问题,因为两个线程都使用相同的线程过程.
请帮我解决一下这个.我真的很困惑,在互联网上找不到任何东西.
可以将相同的函数用作多个线程的线程入口点.
但是,从发布的代码中,地址将i被传递给两个线程.如果任一线程修改此内存而另一个线程读取则存在竞争条件i.没有看到i它的声明可能是一个局部变量.这是危险的,因为线程需要i在其生命周期中存在.如果i不是线程将有一个悬空指针.通常的做法是动态分配线程参数并让每个线程释放其参数.
是的,很可能有多个(并发)线程以相同的入口点开头.除了OS /线程库指定签名并调用它之外,线程入口点函数没有什么特别之处.它可以用来启动多个线程,其注意事项与从多个线程调用任何其他函数相同:您需要同步才能访问非原子共享变量.
每个线程都使用自己的堆栈区域,但是在调用线程过程之前由OS分配,因此在调用线程过程时,已经发生了创建和启动新线程所需的所有特殊操作.