【问题标题】:thread parameter passing c线程参数传递 c
【发布时间】:2012-08-28 21:47:15
【问题描述】:

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

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

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

【问题讨论】:

  • int *arrayA[MSIZE]; 可能是错误的大小。
  • 附带说明,我看不出您在哪里进行反向迭代。我实际上建议在数组中使用偏移量而不是偏移量,这样您就可以更灵活地扩展到更多线程。

标签: c multithreading parameter-passing


【解决方案1】:

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

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

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

【讨论】:

  • 好的,谢谢。我正在将tp.X 加载到一个局部变量中,这样Foo 的另一个线程就不会看到它。还没有尝试这个。我猜另一个 Foo/thread 可以在我将其加载到某个局部变量之前更改 tp.X 值。我很好,一旦调用例程退出,TP 就不再存在了。我的问题是无法将arrayAX 传递给Foo。以及如何“按值”和“按引用”传递它们。
【解决方案2】:

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

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

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

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

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

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

【讨论】:

  • 好的,这里有 2 条关于此的快速说明——澄清一些并避免错误的方向:Foo 的输出是另一个数组,比如 ZarrayA 只是一个“工作区”,不管它的变化是否不会在 Foo 之外看到。但是,由 Foo 的一个线程对arrayA 所做的更改应该被另一个 Foo 线程看到。这就是为什么我一直希望将 tp 的引用传递给 Foo。 Foo 应该读取/写入调用参数传递给它的 mem.location。 & 我应该将该位置的引用传递给 Foo 的两个线程,以便它们在同一个 arrayA 上 R/W。
猜你喜欢
  • 2011-08-04
  • 2015-03-21
  • 2012-06-25
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多