Как использовать мьютекс в многопоточности с C на Linux - PullRequest
0 голосов
/ 10 декабря 2018

как я могу создать два потока в C с помощью pthead_create (), но первый печатает 'h' и 'o', а второй печатает 'ell', и в результате получается 'hello'.Как мы можем решить эту проблему, используя pthread_mutex_lock и разблокировать и без использования sleep ().Помогите, пожалуйста .это то, что я сделал, но иногда это не работает, как ожидалось.

#include <stdio.h>
#include <pthread.h>

pthread_t th[2];
pthread_mutex_t l1,l2;

void *print1(){
    pthread_mutex_lock( &l1 );
    printf("h");
    pthread_mutex_unlock( &l1 );
    pthread_mutex_lock( &l2 );
    printf("o");
    pthread_mutex_unlock( &l2 );
    return NULL;
}
void *print2(){
    pthread_mutex_lock( &l2 );
    printf("ell");
    pthread_mutex_unlock( &l2 );
    return NULL;
}
int main(){
    pthread_create(&th[0],NULL,print1,NULL);
    pthread_create(&th[1],NULL,print2,NULL);
    pthread_join(th[0],NULL);
    pthread_join(th[1],NULL);
    printf("\n");
    return 0;
} 

1 Ответ

0 голосов
/ 10 декабря 2018

Мьютексы обеспечивают взаимное исключение, а не упорядочение.Вам нужно добавить что-то большее или другое, чтобы контролировать относительный порядок операций между потоками.Для этой цели обычными компаньонами мьютексов являются условные переменные .Вы можете выполнять свою работу с одним мьютексом, одной условной переменной и одной обычной общей переменной.В качестве альтернативы, пара семафоров могла бы справиться с вашей конкретной задачей аккуратно и чисто.

Если единственные объекты синхронизации, которые вы можете использовать, это мьютексы, то вы можете попробовать подход мьютекса / CV без CV.Ключевым моментом здесь, с или без резюме, является наличие общей переменной, которая каким-то образом указывает на то, в какой очереди поток.Каждый поток пытается заблокировать мьютекс.В случае успеха поток проверяет переменную общего доступа, чтобы определить, настала ли очередь этого потока, и если это так, он выполняет соответствующую работу, а затем освобождает мьютекс.Если поток блокирует мьютекс и обнаруживает, что это его ход , а не , он освобождает мьютекс и возвращается назад, чтобы повторить попытку.Проблема здесь в том, что для потока возможно прохождение неопределенного количества времени без планирования, и это то, что добавляет переменную условия в адреса смешивания.

...