控制线程中的全局变量

时间:2013-11-21 04:28:40

标签: pthreads embedded-linux

Q1)我有一个应用程序可以执行如下所示的功能。我需要一种机制来等待基于全局计数变量的响应。在那之前,每个被调用的线程都是睡觉的。

答。我们可以使用结构作为争论发送到pthread_create()

typedef args
{
    int arg;
    int gcount;
}sargs;

sargs threadarg[3];

int main()
{
    /** Pass the structure after initializing to pthread_create() and access
    these values when required*/
}

Q2)我可以在没有任何竞争条件的情况下绑定具有相同功能的每个线程吗?

答。是

伪代码:

int gcount[3];
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

main()
{
    pthread_t th[3];
    int arg[3];
    gcount[0]=10;
    gcount[1]=10;
    gcount[2]=10;


    // arg array is filled up with 3 different data values 

    // "same_func()" function is used to invoke the threads with different arg' values
    for( i =0; i< 3; i++)
        pthread_create(&th[i], NULL, same_func, arg[i]);

   for( i = 0;i <3; i++ )
        pthread_join(th[i], NULL)

    return 0;
}

void same_func( void *val)
{
   //Perform sending of this val using send() function for 10 times in each thread.
   // Basically I will be sending some specific data along with "val"

  //This part is troubling me.
  // I need to wait on until the global count decreases based on callback function as shown
  // I am not sure of using "gcount" variable in this way. Wants inputs in here.

   while( gcount[0] > 0 || gcount[1] > 0 || gcount[2] >0 )
       sleep(1);

   pthread_exit(NULL);
}

// This function is invoked when I receive response to the above send()
void callback( void *val)
{
  //Performs some work

  pthread_mutex_lock(&lock);

   if(val == arg[0])
       gcount[0]--;

   if(val == arg[1])
       gcount[1]--;

   if(val == arg[2])
       gcount[2]--;

   pthread_mutex_unlock(&lock);    
}

Q3)另外,当我调用pthread_join()时......它会等到我的线程一直等待。或者它会返回一些错误值并使线程“僵尸”??

答。 Pthread_join()将安全地加入调用所谓的“master”的“worker”线程 调用此线程的线程。

如果您需要进一步的输入,请告知我们。谢谢。 检查Ans。从给出的回复中收集。

2 个答案:

答案 0 :(得分:0)

(1)条件变量是最好的选择可能信号量取决于你真正在做什么。

(2)是的,除非您的send函数存在根本性的问题,即您依赖于线程之间的某些特定发送顺序。否则,您需要使用互斥锁保护共享资源。

(3)pthread_join将继续阻塞,直到您正在等待的线程完成。请注意,无法保证线程将以任何顺序完成,因此如果您等待[0],则可能首先完成1和2,并且当您到达它们时,您将在循环中选择它们。

答案 1 :(得分:0)

您将使用条件变量等待gcount变量达到零:

int gcount[3];
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthraed_cond_t cond = PTHREAD_COND_INITIALIZER;

void same_func(void *val)
{
   //Perform sending of this val using send() function for 10 times in each thread.
   // Basically I will be sending some specific data along with "val"

   /* Wait for all `gcount[]` values to reach zero */
   pthread_mutex_lock(&lock);
   while (gcount[0] > 0 || gcount[1] > 0 || gcount[2] > 0)
       pthread_cond_wait(&cond, &lock);
   pthread_mutex_unlock(&lock);

   pthread_exit(NULL);
}

在回调函数中,您需要发出条件变量的信号:

void callback(void *val)
{
  //Performs some work

  pthread_mutex_lock(&lock);

   if(val == arg[0])
       gcount[0]--;

   if(val == arg[1])
       gcount[1]--;

   if(val == arg[2])
       gcount[2]--;

   if (gcount[0] <= 0 && gcount[1] <= 0 && gcount[2] <= 0)
       pthread_cond_broadcast(&cond);

   pthread_mutex_unlock(&lock);    
}