Подсчитайте, используя потоки Linux C - PullRequest
0 голосов
/ 13 марта 2019

Я пытался написать простую программу для подсчета до n, используя потоки.

Сначала я держал счетчик потоков равным 2, и программа, казалось, работала, затем я увеличил счетчик потоков и понял, что моя программа насчитывает n + NUM_OF_THREADS-2, когда он должен считать только до n-1

Я не смог найти проблему даже после нескольких часов отладки, но похоже, что когда поток проверяет 'myCount', значение ниже предела, но оно изменяется другими потоками после проверки, даже после того, как предел достигнут! Пожалуйста, исправьте меня, если мое понимание неверно, и помогите отладить проблему.

Вот мой код:

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

#define NO_OF_THREADS 5

pthread_mutex_t mlock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t mCond[NO_OF_THREADS] = PTHREAD_COND_INITIALIZER;
static int myCount;
static int n;
volatile int turn = 0;

void *foo(void *arg)
{
  int id = *(int*)arg;

  while(myCount < n)
  {
    pthread_mutex_lock(&mlock);

    //put other threads to sleep
    if(id != turn)
      pthread_cond_wait(&mCond[id],&mlock);

    //critical section
    printf("tid=%d -> %d\n",id,myCount++);

    //choose the next thread to unblock
    if(turn < NO_OF_THREADS-1)
      turn++;
    else
      turn = 0;

    //unblock the next thread
    pthread_cond_signal(&mCond[turn]);
    pthread_mutex_unlock(&mlock);
  }
  pthread_exit(NULL);
}


int main(int argc, void* argv[])
{
  pthread_t tid[NO_OF_THREADS];
  int arg[NO_OF_THREADS];
  int i;

  printf("Enter the max count\n");
  scanf("%d",&n);

  myCount = 0;

  for(i=0;i<NO_OF_THREADS;i++)
  {
    arg[i] = i;
    if(pthread_create(&tid[i],NULL,foo,&arg[i]))
    {
      perror("pthread_create");
      return EXIT_FAILURE;
    }
  }

  for(i=0;i<NO_OF_THREADS;i++)
  {
    pthread_join(tid[i],NULL);
  }

  return 0;
}
...