我的问题是将参数传递给线程。
我有一个在数组上运行的函数Foo,比如arrayA。为了加快速度,Foo被编码为在阵列上的两个方向上运行。因此,Foo将arrayA和整数X作为参数。根据X的值,它可以正向或反向运行。
我希望避免全局使用“arrayA”和“X”。所以,我将“arrayA”和“X”作为参数传递给Foo,并创建两个线程来运行Foo--每个方向一个。这是我做的:
typedef struct {int* arrayA[MSIZE]; int X; } TP; //arrayPack=TP
void Foo (void *tP) {
TP *tp = (TP*)tP; // cast the parameter tP back to what it is and assign to pointer *tp
int x;
printf("\nX: %d", tp->X);
printf("\n arrayA: "); for (x=0; x<tp->arrayA.size(); printf("%d ", aP->arrayA[x]), x++);
} // end Foo
void callingRouting () {
int* arrayA[MSIZE] = {3,5,7,9};
TP tp; tp.arrayA=arrayA;
tp.X=0; _beginthread(Foo, 0, (void*)&tp); // process -- forward
tp.X=1; _beginthread(Foo, 0, (void*)&tp); // process -- reverse
}
值没有通过 - 我的数组打印为空,我没有将X的值打印得正确。我错过了什么?
我也很欣赏有关这方面的一些阅读建议 - 将参数传递给线程 - 特别是在传递线程共享的资源时。谢谢。
答案 0 :(得分:2)
当callingRouting
退出TP
结构不再存在时,您将堆栈变量的地址传递给线程函数。它们需要是全局变量或在堆上分配。
但是,每个线程都需要两个TP
副本,因为两个线程都可以看到更改tp.X=1
。
那里有问题,但你如何看待它们取决于操作系统如何决定在每次执行时安排线程。
答案 1 :(得分:2)
要记住的第一件事是你有一个线程正在启动另外两个线程。由于您无法控制处理器时间片以及如何分配处理器时间片,因此您无法确定其他两个线程何时开始,甚至可能不是它们将开始的顺序。
由于你在函数callingRouting ()
的本地堆栈上使用了一个数组,一旦该函数返回,分配的局部变量将基本上超出范围,不能再依赖它。
所以有几种方法可以做到这一点。
第一种是对传递给线程的这些数据项使用全局或静态内存变量。
另一个是启动两个线程,然后等待两个线程完成再继续。
由于您不知道何时或正在启动线程的顺序,您实际上应该使用两个不同的TP类型变量,每个线程一个。否则,您将冒时间片分配的风险,使两个线程都具有相同的TP数据。