当我在程序中创建一个新线程...在它的线程句柄函数中,为什么我要通过线程函数原型作为参数传递我希望该线程使用的变量(作为void指针)?由于线程共享相同的内存段(堆栈除外)作为主程序,我不应该只是直接使用变量而不是将参数从主程序传递到新线程吗?
答案 0 :(得分:3)
嗯,是的,你可以直接使用这些变量。也许。假设在线程开始运行之前它们没有被其他线程更改。
此外,将参数传递给函数(包括线程函数)的很大一部分是限制被调用函数必须知道的有关外部世界的信息量。如果你传递线程函数所需的一切,以便完成它的工作,那么你可以相对有罪不罚地更改程序的其余部分,线程仍然可以继续工作。但是,如果您强制线程知道存在名为MyStringList
的全局字符串列表,那么您无法更改该全局列表而不会影响该线程。
信息隐藏。封装。关注点分离。等
答案 1 :(得分:0)
您不能以任何正常的寄存器/堆栈方式将参数传递给线程函数,因为创建线程不会调用线程函数 - 它们由底层操作系统直接执行,并且执行此操作的API复制固定数字参数,(通常只有一个空指针),到新线程的新的和不同的堆栈。
正如吉姆所说,未能理解这种机制往往会导致灾难。关于开发的变量,SO上有一些问题。在新线程开始之前,新线程会使用希望RAII离开。