我想使用for
创建5个线程-像这样循环,
for(int i=0;i<5;i++){
pthread_create(...., NULL, printHelloWorld, (void *)&i);
}
void printHelloWorld(void *arg){
printf("%d\n", *(int *)arg);
}
//在这段代码中
- i=0
- 线程创建 -> printHelloWorld
- i++(i=1); -> 通过 for 循环
- 我在 printHelloWorld 中打印 arg。我认为 arg 是 0 但结果 arg 是 1;
//所以我认为使用数组 -> 但使用 20 字节内存。
//我想使用小于20byte的内存。 你有什么好主意吗?
最佳答案
您可能会问,为什么第一个线程从 i
获取值 1,而不是预期的 0。
这样做的原因是,您传递了对 i
的引用。对 i
的每一次更改都是对每个引用它的人的更改。您必须为每个线程创建一个副本。
这会导致代码的另一个问题:如果线程运行时间比创建代码长,i
将在内存中丢失,并且传递的引用无效。你应该做这样的事情:
for(int i=0;i<5;i++)
{
int *arg = malloc( sizeof int ); // Likely you want to have a bigger structure.
*arg = i;
pthread_create(...., NULL, function, arg );
}
在 Safari 中输入。
function()
必须在其末尾释放分配的内存。
void *function( void *param )
{
int i = *param;
free( param );
…
}
关于C语言for循环创建线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48275859/