Как чередовать 5 значений 0 и 5 значений 1, используя pthread в C? - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть небольшое назначение с использованием языка C, который заполняет целочисленный массив размером 30 с чередующимися 5 значениями 0 (записанными одним потоком) и 5 ​​значениями 1 (записанными вторым потоком).

Вот мой код на данный момент:

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

 int count = 0;
 int oktogo = 1; //0 is false, 1 is true. For thread2 this is reversed.

  pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  pthread_cond_t condition = PTHREAD_COND_INITIALIZER;

  void *start_thread_one()
  {
    int i;
     for (i=1;i<30;i++) {
        pthread_mutex_lock(&mutex);
        while (oktogo == 0)
           pthread_cond_wait(&condition, &mutex);
        count=0;
        printf("thread one: %d\n", count);
        oktogo = 0;
        pthread_mutex_unlock(&mutex);
        pthread_cond_signal(&condition);
    }
    pthread_exit(0);
    }

 void *start_thread_two()
 {
   int i;
    for(i=1;i<30;i++) {
       pthread_mutex_lock(&mutex);
       while (oktogo == 1)
           pthread_cond_wait(&condition, &mutex);
       count =1;
       printf("thread two: %d\n", count);
       oktogo = 1;
       pthread_mutex_unlock(&mutex);
       pthread_cond_signal(&condition);
   }
   pthread_exit(0);
 }

 int main ()
 {
  int count = 0;
  pthread_t p1,p2;

  pthread_create(&p1,NULL,(void *)start_thread_one,NULL);
  pthread_create(&p2,NULL,(void *)start_thread_two,NULL);

   pthread_join(p1,NULL);
   pthread_join(p2,NULL);

   return(0);
}

В выходных данных только что было показано значение потока 1, равного 0, а затем потока 2, равного 1. Как я могу распечатать 5 значений 0, а затем 5 значений 1 поочередновместо одного за другим?

Скриншот:

enter image description here

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Когда вы думаете о параллельном программировании, вы можете подумать о двух конструкциях: 1. Каждый поток делает что-то свое. 2. Каждый поток делает что-то очень похожее, но с конкретными показателями.

Я бы указал желаемый диапазон.нить 0 и нить 1 и т. д. для покрытия и ввода их значений.

0 голосов
/ 28 ноября 2018

Кажется, что логика синхронизации вашего потока в порядке.

Единственная проблема заключалась в том, что вы фактически не сохраняли в массиве, когда у вас была возможность [и основной поток] распечатать его после присоединения кпотоки.

Кроме того, вам не нужны две отдельные функции потоков.Вы можете использовать один аргумент / значение, равное 0 или 1. То есть аргумент arg задает начальное смещение в массиве для потока и значение для хранения, а также необходимое значение для oktogo.

В любом случае, вот рабочая версия:

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

int count = 0;
int oktogo = 0;                         // 0 is false, 1 is true. For thread2 this is reversed.

#define CHUNK       5
int array[5000];

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t condition = PTHREAD_COND_INITIALIZER;

void *
start_thread(void *ptr)
{
    long self = (long) ptr;
    int i;

    for (i = 1; i < 30; i++) {
        pthread_mutex_lock(&mutex);

        while (oktogo != self)
            pthread_cond_wait(&condition, &mutex);

        printf("thread %ld: %d\n",self,count);
        for (int idx = 0;  idx < CHUNK;  ++idx, ++count)
            array[count] = self;

        oktogo = ! self;
        pthread_mutex_unlock(&mutex);
        pthread_cond_signal(&condition);
    }

    pthread_exit(0);
}

int
main()
{
    int count = 0;
    pthread_t p1,
     p2;

    for (int idx = 0;  idx < sizeof(array) / sizeof(array[0]);  ++idx)
        array[idx] = -1;

    pthread_create(&p1, NULL, (void *) start_thread, (void *) 0);
    pthread_create(&p2, NULL, (void *) start_thread, (void *) 1);

    pthread_join(p1, NULL);
    pthread_join(p2, NULL);

    for (int idx = 0;  idx < sizeof(array) / sizeof(array[0]);  ++idx) {
        if (array[idx] >= 0)
            printf("%d: %d\n",idx,array[idx]);
    }

    return (0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...