Я хочу зачекати у функції з потоку (Запустити в основній функції), поки не вивільниться мьютекс. Чи можливо це, або мутекси можуть використовуватися лише створеними потоками? Тож чи можемо ми поводитися так, ніби основна - це нитка? Зараз я отримую таку помилку:
_pthread_mutex_lock: Assertion `mutex->__data.__owner == 0" failed.
Функція, яку я називаю в основному:
void SetFrame()
{
pthread_mutex_lock( &Framemutex );
pthread_cond_wait( &Framecondition, &Framemutex );
pthread_mutex_lock( &UsableFrame );
IplImage *UsableFrame=cvCloneImage(Frame);
pthread_mutex_unlock( &UsableFrame );
pthread_mutex_unlock( &Framemutex );
}
Я сподівався, що зможу в основному дочекатися стану. Але я вважаю, що це не так можливо. Або це ?
Дякую.
Відповіді:
0 для відповіді № 1Mutex може використовуватися будь-якими потоками, де вони доступні (навіть різні процеси, якщо вони перебувають у спільній пам'яті).
Іншим підходом до використання семафорів може бути наступний.
Ви можете зробити щось наступним, використовуючи глобальний:
sem_t sem;
На початку вашого основного, ви могли б мати (якщо ви поділяєте між потоком, а не обробляєте):
sem_init(&sem, 0, 0); //the counter of the semaphore is init with value 0
Потім, головним чином:
sem_wait(&sem);
де ви хочете, щоб головне зачекало.
Нарешті, у коді потоку, коли ви хочете зробити основний запуск, ви додаєте:
sem_post(&sem);
Зверніть увагу, що вищезазначене працює лише для двох потоків (інакше sem_post буде викликано занадто багато разів, збільшуючи лічильник семафору занадто багато разів).