【发布时间】:2014-12-29 08:00:50
【问题描述】:
您能否澄清一下,为什么下面的代码是一种将参数传递到新线程的安全方式:
//Listing 5.3 Passing a Value into a Created Thread
for ( int i=0; i<10; i++ )
pthread_create( &thread, 0, &thread_code, (void *)i );
下面的代码不是:
//Listing 5.4 Erroneous Way of Passing Data to a New Thread
for ( int i=0; i<10; i++ )
pthread_create( &thread, 0, &thread_code, (void *)&i );
从书中引用,关于代码:
重要的是要意识到子线程可以在调用后的任何时候开始执行,所以指针必须指向仍然存在并且仍然保持相同值的东西。这排除了传递指向变化变量的指针以及指向堆栈上保存的信息的指针(除非堆栈肯定存在,直到子线程读取该值之后)。
【问题讨论】:
-
书中说第二种方法是“将数据传递到新线程的错误方式”
-
是否保证第一种方法中的
i即使在循环完成后也能保持活动状态? -
我们说是的。启动所有线程后,加入所有线程是合理的。
-
这不是关于让变量是否存在将由“C”规范指导。在您的情况下,它应该是 C99 或 C11。你的书本身说
unless the stack is certain to exist -
@MohitJain:在第一种方法中,您根本不依赖变量是否仍然存在。