В1) У меня есть приложение, которое работает так, как показано ниже. Мне нужен был механизм ожидания ответа на основе глобальной переменной count. До тех пор каждый вызванный поток приостанавливается.
Ответ Мы можем использовать структуру для отправки аргументов функции 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() безопасно присоединит этот "рабочий" поток, вызванный к так называемому "главному" потоку, из которого этот поток вызывается.
Пожалуйста, дайте мне знать, если для вашего ответа потребуются какие-либо дополнительные данные. Спасибо. Проверьте ответ. собраны из предоставленных ответов.