2011-02-08 2 views
1

Если у меня есть 2 потока Thread1 и Thread2, но Thread2 будет использовать некоторые данные, которые обрабатываются, когда Thread1 заканчивается. Есть ли способ Thread2 дождаться завершения Thread1, а затем получить данные?Проблема с posix threads C++

ответ

1

Если вам нужны данные thread1, а не только простой блокировки для предотвращения одновременного доступа, то вы должны использовать семафор :

#include <semaphore.h> 

    int sem_init(sem_t *sem, int pshared, unsigned int value); 

    int sem_post(sem_t *sem); 

    int sem_wait(sem_t *sem); 

    int sem_trywait(sem_t *sem); 

    int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout); 

    int sem_destroy(sem_t *sem); 

Основная программа запускает sem_init перед запуском потоков. В потоке 1 выполняется sem_post, чтобы указать, что это сделано. В Thread 2 используется sem_wait, чтобы гарантировать, что Thread 1 будет завершен до его запуска.

+0

aaa да, это то, что мне нужно, отлично, много thnaks – Kobe

0

Это называется мьютексом. pthreads вызывает pthread_mutex, вы должны найти их в документах.

0

Да, вы можете использовать мьютекс «охранником» данные в вопросе:

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr); 
int pthread_mutex_lock(pthread_mutex_t *mutex); 
int pthread_mutex_trylock(pthread_mutex_t *mutex); 
int pthread_mutex_timedlock(pthread_mutex_t *mutex, const struct timespec *abs_timeout); 
int pthread_mutex_unlock(pthread_mutex_t *mutex); 
int pthread_mutex_destroy(pthread_mutex_t *mutex); 
+0

Я знаю о мьютексе, но я не знаю, как их использовать в моем случае. Трейдер1 обрабатывает класс с 2 статическими данными, а thread2 должен использовать статические данные thoose. Класс :: data1, Class :: data2, я знаю, чтобы использовать мьютекс только при доступе к тем же данным в одном потоке. Мой Thread2 получает данные, используя функции get из thread1 – Kobe

1

Один из способов заключается в использовании условие ВАР: Ex:

pthread_mutex_t mx; 
pthead_cond_t cond; 

void first_f(void *) { 
... 
    pthread_mutex_lock(&mx) 

// do something in first function 
// the second function is waiting 

    pthread_cond_signal(&cond); 
    pthread_mutex_unlock(&mx); 
    } 
    return NULL; 
} 

void second_f(void *) { 
... 
    pthread_mutex_lock(&mx)  
    pthread_cond_wait(&cond, &mx); 

// waiting for first function until we catch a signal 

    pthread_mutex_unlock(&mx); 
    } 
    return NULL; 
} 

Второй способ заключается в использовании двух семафоров. Первые слагает в 1, второй - в ноль. Когда первая функция заканчивается, она устанавливает первый сэмпл равным 0, а второй sem - 1. Вторая функция ждет, пока второй семафор не будет установлен на 1 по первой функции и не будет работать.

+0

Спасибо за объяснение, я думаю, буду использовать семафоры – Kobe

+0

Я согласен с тобой. Семафоры более гибкие. – SVGreg

Смежные вопросы