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

标签 c windows multithreading winapi 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
                            ) 

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

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

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

最佳答案

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

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

关于两个线程可以使用相同的线程过程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16333381/

相关文章:

c - C 和 SICP 中的尾递归

C# 存储数字的安全方式?

android - 使用 MediaCodec 录制 720p 视频但编码视频的 fps 太低

python - 当子类化 threading.Thread 时,我是否必须调用 super.join() ?

从 C 调用汇编代码在多次调用后删除地址

c - 警告 : format not a string literal, 未检查参数类型

c - 为什么复制后数组指针不指向数组的开头

c++ - 如何从进程中分离exe

windows - Vagrant up 命令给出在 %PATH% 错误中找不到的可执行文件

java - 两个线程执行完毕后进行清理