线程参数传递c

时间:2012-08-28 21:47:15

标签: c multithreading parameter-passing

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

我有一个在数组上运行的函数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的值打印得正确。我错过了什么?

我也很欣赏有关这方面的一些阅读建议 - 将参数传递给线程 - 特别是在传递线程共享的资源时。谢谢。

2 个答案:

答案 0 :(得分:2)

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

但是,每个线程都需要两个TP副本,因为两个线程都可以看到更改tp.X=1

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

答案 1 :(得分:2)

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

由于你在函数callingRouting ()的本地堆栈上使用了一个数组,一旦该函数返回,分配的局部变量将基本上超出范围,不能再依赖它。

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

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

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

由于您不知道何时或正在启动线程的顺序,您实际上应该使用两个不同的TP类型变量,每个线程一个。否则,您将冒时间片分配的风险,使两个线程都具有相同的TP数据。