0

我的问题是关于传递给线程的参数。

我有一个函数 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 的值。我错过了什么?

我也很感激关于这方面的一些阅读的建议——将参数传递给线程——尤其是在传递线程共享的资源方面。谢谢。

4

2 回答 2

2

您将堆栈变量的地址传递给您的线程函数,一旦callingRouting退出该TP结构不再存在。它们需要是全局变量或在堆上分配。

但是TP,每个线程都需要两个副本,因为更改tp.X=1可能对两个线程都是可见的。

那里存在问题,但您如何看待它们取决于操作系统如何决定在每次执行时安排线程。

于 2012-08-28T21:55:14.673 回答
2

首先要记住的是,您有一个线程正在启​​动另外两个线程。由于您无法控制处理器时间片及其分配方式,因此您无法确定其他两个线程何时启动,甚至可能不是它们启动的顺序。

由于您在函数返回后立即使用函数本地的堆栈上的数组,因此callingRouting ()分配的局部变量基本上超出范围并且不再依赖。

所以有几种方法可以做到这一点。

第一种是对传递给线程的这些数据项使用全局或静态内存变量。

另一种是启动两个线程,然后等待两者都完成后再继续。

由于您不知道线程何时启动或启动的顺序,因此您确实应该使用两个不同的 TP 类型变量,每个线程一个。否则,您将面临时间片分配的风险,即两个线程将具有相同的 TP 数据。

于 2012-08-28T22:00:55.980 回答