2 потока работают параллельно и ожидают одного и того же состояния - PullRequest
0 голосов
/ 18 июня 2019

2 массива одинакового размера.Необходимо создать 2 потока, каждый из которых отвечает за 1 массив, потоки должны работать одновременно.После того, как оба потока задают один элемент (array_B [i] = ++ count;), массивы должны выводиться на экран, ждать нажатия клавиши, затем потоки должны продолжаться и т. Д.

IЯ не уверен на 100%, если это должно быть решено с мьютексами или нет.Он работает в определенной степени, но программа не останавливается после 1 обновления для каждого массива, как и предполагалось.

pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutex_B = PTHREAD_MUTEX_INITIALIZER;


int array_A[NMax], array_B[NMax];

void *fun_A(void *arg)
{
    int count = 0;
    for (int i = 0 ; i < NMax ; ++i)
        {
            pthread_mutex_lock(&mutex_A);
            array_A[i] = ++count;
            pthread_mutex_unlock(&mutex_A);
        }
    return NULL;
}

void *fun_B(void *arg)
{
    int count = 0;
    for (int i = 0 ; i < NMax ; ++i)
        {
            pthread_mutex_lock(&mutex_B);
            array_B[i] = ++count;
            pthread_mutex_unlock(&mutex_B);
        }
    return NULL;
}

void Print()
{
    system("cls");
    for (int i = 0 ; i < NMax ; ++i)
        printf("%d ", array_A[i]);

    printf("\n\n");

    for (int i = 0 ; i < NMax ; ++i)
        printf("%d ", array_B[i]);

    getch();
}

int main()
{
    pthread_t A_th, B_th;

    pthread_create(&A_th, NULL, &fun_A, NULL);
    pthread_create(&B_th, NULL, &fun_B, NULL);

    while (1)
    {
        pthread_mutex_lock(&mutex_A);
        pthread_mutex_lock(&mutex_B);

        Print();

        pthread_mutex_unlock(&mutex_A);
        pthread_mutex_unlock(&mutex_B);
    }

    pthread_join(A_th, NULL);
    pthread_join(B_th, NULL);
    return 0;
}
...