/ / Чи можна заблокувати головну функцію за допомогою “pthread_mutex_lock”? - c, багатопотоковість, мьютекс

Чи можна заблокувати основну функцію через "pthread_mutex_lock"? - c, багатопоточність, мьютекс

Я хочу зачекати у функції з потоку (Запустити в основній функції), поки не вивільниться мьютекс. Чи можливо це, або мутекси можуть використовуватися лише створеними потоками? Тож чи можемо ми поводитися так, ніби основна - це нитка? Зараз я отримую таку помилку:

_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 для відповіді № 1

Mutex може використовуватися будь-якими потоками, де вони доступні (навіть різні процеси, якщо вони перебувають у спільній пам'яті).

Іншим підходом до використання семафорів може бути наступний.

Ви можете зробити щось наступним, використовуючи глобальний:

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 буде викликано занадто багато разів, збільшуючи лічильник семафору занадто багато разів).