세마포가 여러 스레드에서 올바르게 작동하지 않는 것 같습니다.

에롤 구조 글루

C를 사용하여 여러 스레딩 예제를 작성하려고합니다. 이는 사용자로부터 가져 오는 숫자이고 두 스레드의 합계입니다.

스레드는 앞뒤 및 뒤에서 앞으로 서로 직접 떨어져 있습니다.

세마포어를 사용하여 전역 변수를 관리하고 있지만 출력에 세마포가 제대로 작동하지 않는 것으로 표시됩니다.

뭐가 잘못 되었 니?

코드 출력 :

Array size? :10
Array of contents? :4 2 8 1 5 3 7 9 6 10
Thread_1 > read 4, sum is = 4 
Thread_1 > read 2, sum is = 6 
Thread_1 > read 8, sum is = 14 
Thread_1 > read 1, sum is = 15 
Thread_1 > read 5, sum is = 20 
Thread_1 > read 3, sum is = 23 
Thread_1 > read 7, sum is = 30 
Thread_1 > read 9, sum is = 39 
Thread_1 > read 6, sum is = 45 
Thread_1 > read 10, sum is = 55 
Thread_1 > End. 
Thread_2 > End. 

코드 :

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

int *array; //Global integer array
int sum;    //Global sum variable
int counter = 0;

sem_t mutex;

void *front_to_back( void *val )
{
  int SIZE;
  SIZE = *((int *) val);

  while (1)
  {
    sem_wait(&mutex);

    if( counter != SIZE )
    {
      sum = sum + array[counter];

      printf("Thread_1 > read %d, sum is = %d \n", array[counter], sum);

      counter++;

    }else
    {
      printf("Thread_1 > End. \n");

      sem_post(&mutex);

      break;
    }

    sem_post(&mutex);
  }
}


void *back_to_front( void *val )
{
  int SIZE;
  SIZE = *((int *) val);

  int i=1;

  while (1)
  {
    sem_wait(&mutex);

    if( counter != SIZE )
    {
      sum = sum + array[SIZE - i];

      printf("Thread_2 > read %d, sum is = %d \n", array[SIZE - i], sum);

      counter++;
      i++;

    }else
    {
      printf("Thread_2 > End. \n");

      sem_post(&mutex);

      break;
    }

    sem_post(&mutex);
  }
}

main(){

  int SIZE;

  printf("Array size? :");
  scanf("%d", &SIZE);

  array = malloc(SIZE*sizeof(int));

  int i=0;

  printf("Array of contents? :");
  for (i ; i<SIZE ; i++)
  {
    scanf("%d", &array[i]);
  }

  pthread_t t[2];

  sem_init(&mutex, 0, 1);

  pthread_create(&t[1], NULL, front_to_back, (void *) &SIZE );
  pthread_create(&t[2], NULL, back_to_front, (void *) &SIZE );

  pthread_join(t[1],NULL);
  pthread_join(t[2],NULL);

  free(array);
  sem_destroy(&mutex);

}
필리페 곤살 베스

당신은 사용해야 t[0]t[1]main(): 크기의 배열이 N유효한 인덱스에있다 0..N-1, 그래서 먼저, 수정이 있습니다. 올바른 코드는 다음과 같습니다.

pthread_create(&t[0], NULL, front_to_back, (void *) &SIZE );
pthread_create(&t[1], NULL, back_to_front, (void *) &SIZE );

pthread_join(t[0],NULL);
pthread_join(t[1],NULL);

이상적으로, 당신은 또한 여부를 확인해야 malloc()하고 pthread_create()성공. 이러한 함수는 오류와 함께 반환 될 수 있으므로 처리해야합니다. 코드는 오류를 무시합니다 (범위를 벗어난 액세스를 사용하면 실제로 작동하는 것이 운이 좋습니다).

또한 뮤텍스 인 것처럼 세마포어를 사용하는 이유는 무엇입니까? 여기서 세마포어는 실제로 필요하지 않습니다. 세마포어의 성능과 유연성이 필요하지 않을 때는 뮤텍스를 사용하십시오. 한 가지 중요한 차이점은 세마포를 사용하면 한 스레드에서 대기하고 다른 스레드에 게시 할 수있는 반면 뮤텍스는이를 획득 한 스레드에 의해 잠금 해제되어야한다는 것입니다.

따라서 뮤텍스로 충분한 세마포어를 사용하면 코드의 오류를 덮을 수 있습니다. 그래서 저는 계속해서 뮤텍스를 대신 사용하겠습니다. 모든 변경 사항이 적용된 코드는 다음과 같습니다.

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

int *array; //Global integer array
int sum;    //Global sum variable
int counter = 0;

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void *front_to_back( void *val )
{
    int SIZE;
    SIZE = *((int *) val);

    while (1)
    {
        pthread_mutex_lock(&mutex);

        if( counter != SIZE )
        {
            sum = sum + array[counter];

            printf("Thread_1 > read %d, sum is = %d \n", array[counter], sum);

            counter++;

        }else
        {
            printf("Thread_1 > End. \n");

            pthread_mutex_unlock(&mutex);

            break;
        }

        pthread_mutex_unlock(&mutex);
    }
    return NULL;
}


void *back_to_front( void *val )
{
    int SIZE;
    SIZE = *((int *) val);

    int i=1;

    while (1)
    {
        pthread_mutex_lock(&mutex);

        if( counter != SIZE )
        {
            sum = sum + array[SIZE - i];

            printf("Thread_2 > read %d, sum is = %d \n", array[SIZE - i], sum);

            counter++;
            i++;

        }else
        {
            printf("Thread_2 > End. \n");

            pthread_mutex_unlock(&mutex);

            break;
        }

        pthread_mutex_unlock(&mutex);
    }
    return NULL;
}

int main(void) {

    int SIZE;

    printf("Array size? :");
    scanf("%d", &SIZE);

    array = malloc(SIZE*sizeof(int));

    int i=0;

    printf("Array of contents? :");
    for (; i<SIZE ; i++)
    {
        scanf("%d", &array[i]);
    }

    pthread_t t[2];

    pthread_create(&t[0], NULL, front_to_back, (void *) &SIZE );
    pthread_create(&t[1], NULL, back_to_front, (void *) &SIZE );

    pthread_join(t[0],NULL);
    pthread_join(t[1],NULL);

    free(array);

    return 0;

}

첫눈에 코드에 다른 문제가 보이지 않습니다.

이제 문제는 병렬 처리가 보이지 않는다는 것입니다. 더 큰 배열로 시도해야합니다. 단일 스레드는 컨텍스트 전환 전에 10 개의 요소 배열을 처리 할 수 ​​있습니다.

업데이트 : 방금 3000 요소 배열로 코드를 시도했습니다. 병렬로 실행되는 것을 명확하게 볼 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

HTML 노드를 가져올 때 PHP appendChild가 올바르게 작동하지 않는 것 같습니다.

분류에서Dev

함수 후 jQuery가 테이블에서 올바르게 작동하지 않는 것 같습니다.

분류에서Dev

Django 서버가 올바르게 시작되지 않는 것은 mysql 문제인 것 같습니다.

분류에서Dev

JavaScript의 조건부 및 for 루프에서 break 문이 올바르게 작동하지 않는 것 같습니다.

분류에서Dev

TinyXML2가 내 파일을 올바르게로드하지 않는 것 같습니다.

분류에서Dev

AWS Elastic mapreduce가 스트리밍을 jar로 올바르게 변환하지 않는 것 같습니다.

분류에서Dev

AWS Elastic mapreduce가 스트리밍을 jar로 올바르게 변환하지 않는 것 같습니다.

분류에서Dev

Mechanicalsoup의 StatefulBrowser가 while True 루프에서 올바르게 새로 고쳐지지 않는 것 같습니다.

분류에서Dev

Plotnine 테마 element_blank ()가 작동하지 않는 것 같습니다. 아마도 패키지를 올바르게 가져 오지 않았습니까?

분류에서Dev

코드가 올바르게 읽히는 것 같지만 실행되지 않습니다.

분류에서Dev

Python ANTLR4 예제-파서가 올바르게 구문 분석되지 않는 것 같습니다.

분류에서Dev

상태가 올바르게 업데이트되지 않는 것 같습니다.

분류에서Dev

sklearn 선형 회귀가 올바르게 맞지 않는 것 같습니다.

분류에서Dev

PyTorch가 올바르게 최적화되지 않는 것 같습니다.

분류에서Dev

자바 스크립트가 작동하지 않는 것 같습니다. JSFiddle에서는 작동합니다.

분류에서Dev

CSS가 모바일 장치에서 작동하지 않는 것 같습니다.

분류에서Dev

상대 레이아웃을 사용하여 두 이미지를 스와핑하는 것이 올바르게 작동하지 않습니다.

분류에서Dev

자바 스크립트 : typeof가 작동하지 않는 것 같습니다.

분류에서Dev

toLowerCase () 메서드가 작동하지 않는 것 같습니다.

분류에서Dev

텍스처가 여러면에 올바르게 적용되지 않습니다.

분류에서Dev

JQuery가 Wordpress에서 작동하지 않는 것 같습니다.

분류에서Dev

AVD에서 sdcard가 작동하지 않는 것 같습니다.

분류에서Dev

Flexbox가 IE에서 작동하지 않는 것 같습니다.

분류에서Dev

"Require"가 systemd에서 작동하지 않는 것 같습니다.

분류에서Dev

apt-get이 라이브러리 패키지를 올바르게 설치하지 않는 것 같습니다.

분류에서Dev

backbone.js에서 여러 경로가 올바르게 작동하지 않음

분류에서Dev

Quicksort 데스크 테스트가 올바르지 않은 것 같습니다.

분류에서Dev

개체에 동적으로 메서드를 추가하는 것이 올바르게 작동하지 않음 (setattr)

분류에서Dev

ATBS Conway의 Game of Life 코드가 올바르지 않은 것 같습니다.

Related 관련 기사

  1. 1

    HTML 노드를 가져올 때 PHP appendChild가 올바르게 작동하지 않는 것 같습니다.

  2. 2

    함수 후 jQuery가 테이블에서 올바르게 작동하지 않는 것 같습니다.

  3. 3

    Django 서버가 올바르게 시작되지 않는 것은 mysql 문제인 것 같습니다.

  4. 4

    JavaScript의 조건부 및 for 루프에서 break 문이 올바르게 작동하지 않는 것 같습니다.

  5. 5

    TinyXML2가 내 파일을 올바르게로드하지 않는 것 같습니다.

  6. 6

    AWS Elastic mapreduce가 스트리밍을 jar로 올바르게 변환하지 않는 것 같습니다.

  7. 7

    AWS Elastic mapreduce가 스트리밍을 jar로 올바르게 변환하지 않는 것 같습니다.

  8. 8

    Mechanicalsoup의 StatefulBrowser가 while True 루프에서 올바르게 새로 고쳐지지 않는 것 같습니다.

  9. 9

    Plotnine 테마 element_blank ()가 작동하지 않는 것 같습니다. 아마도 패키지를 올바르게 가져 오지 않았습니까?

  10. 10

    코드가 올바르게 읽히는 것 같지만 실행되지 않습니다.

  11. 11

    Python ANTLR4 예제-파서가 올바르게 구문 분석되지 않는 것 같습니다.

  12. 12

    상태가 올바르게 업데이트되지 않는 것 같습니다.

  13. 13

    sklearn 선형 회귀가 올바르게 맞지 않는 것 같습니다.

  14. 14

    PyTorch가 올바르게 최적화되지 않는 것 같습니다.

  15. 15

    자바 스크립트가 작동하지 않는 것 같습니다. JSFiddle에서는 작동합니다.

  16. 16

    CSS가 모바일 장치에서 작동하지 않는 것 같습니다.

  17. 17

    상대 레이아웃을 사용하여 두 이미지를 스와핑하는 것이 올바르게 작동하지 않습니다.

  18. 18

    자바 스크립트 : typeof가 작동하지 않는 것 같습니다.

  19. 19

    toLowerCase () 메서드가 작동하지 않는 것 같습니다.

  20. 20

    텍스처가 여러면에 올바르게 적용되지 않습니다.

  21. 21

    JQuery가 Wordpress에서 작동하지 않는 것 같습니다.

  22. 22

    AVD에서 sdcard가 작동하지 않는 것 같습니다.

  23. 23

    Flexbox가 IE에서 작동하지 않는 것 같습니다.

  24. 24

    "Require"가 systemd에서 작동하지 않는 것 같습니다.

  25. 25

    apt-get이 라이브러리 패키지를 올바르게 설치하지 않는 것 같습니다.

  26. 26

    backbone.js에서 여러 경로가 올바르게 작동하지 않음

  27. 27

    Quicksort 데스크 테스트가 올바르지 않은 것 같습니다.

  28. 28

    개체에 동적으로 메서드를 추가하는 것이 올바르게 작동하지 않음 (setattr)

  29. 29

    ATBS Conway의 Game of Life 코드가 올바르지 않은 것 같습니다.

뜨겁다태그

보관