c 언어 루틴 호환 잠금 실례

16628 단어 c 언어 스레드
c 언어 루틴 호환 잠금 실례
실험 요구
Linux에서는 C 언어 편집 프로그램을 사용하여 두 개의 스레드 사이를 동기화합니다. 한 스레드는 표준 입력 장치에서 데이터를 읽고, 다른 스레드는 읽은 데이터를 표준 출력 장치에 출력하고, 'end' 를 입력할 때 프로그램을 종료합니다.
생각을 짜내다.
스레드를 만든 후 수면을 통해 서브스레드에 들어가 자물쇠를 잠그고 퇴출 표지를 판단하며 힌트 정보를 출력한다. 수조에 저장하여 자물쇠를 풀고 잠그고 주 스레드에 들어가 자물쇠를 풀고 수면을 위해 서브스레드에 들어가 자물쇠를 푼다. 서브스레드를 끝낸 후에 서브스레드로 돌아가 서브스레드를 회수하여 전체 프로세스에서 퇴출한다. 전체 프로세스에서 빈 자물쇠를 풀고 수면을 위해 서브스레드에 들어가 자물쇠를 잠그고 출력 힌트 정보를 저장한다.수면이 주 라인에 들어가고 나머지 상황은 데이터를 출력하여 잠금을 풀고 수면이 하위 라인에 들어가 순환을 실현한다
세부 코드
#include 
#include 
#include 
#include 
#include 
#include 
/*                ,      ,
      ,      ,       ,      ,
      ,      ,         ,                      
                   ,      ,       
         ,             */
void *thread_function(void *arg);
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t work_mutex; /*       ,              */
#define WORK_SIZE 1024      /*       */
char work_area[WORK_SIZE];
int quit = 0; //    

int main(int argc, char *argv[]) 
{
    pthread_t a;
    if (pthread_mutex_init(&work_mutex, NULL) != 0) 
    {
        perror(" work_mutex init failed ");
        exit(0);
    }
    if (pthread_create(&a, NULL, thread_function, NULL) != 0) 
    {
        perror("thread create failed");
        exit(0);
    }
    sleep(1);                                    //          
    while (1)
    {
        if (pthread_mutex_lock(&work_mutex) != 0)        //  
        {
            perror("pthread_mutex_lock");
        }
		if (strcmp("end
"
, work_area) == 0) // { // quit = 1; // if (pthread_mutex_unlock(&work_mutex) != 0) // { perror(" cannot work_mutex unlock "); exit(0); } sleep(1); // pthread_join(a, NULL); // printf("
"
); exit(0); // } else { while (work_area[0] != '
'
) //&& work_area[0] != '\0' { printf(" :%s", work_area); printf(" :%d
"
, strlen(work_area) - 1); memset(work_area, '\0', sizeof(work_area)); // } if (pthread_mutex_unlock(&work_mutex) != 0) // */ { perror(" cannot work_mutex unlock "); exit(0); } sleep(1); } } } void *thread_function(void *arg) /* */ { while (1) { if (pthread_mutex_lock(&work_mutex) != 0) // { perror("pthread_mutex_lock"); } if(quit !=1) // { printf(" , end
"
); fgets(work_area, WORK_SIZE, stdin); // pthread_mutex_unlock(&work_mutex); // sleep(1); } else // , { pthread_mutex_unlock(&work_mutex); pthread_exit(0); } } }

소결
프로그래밍을 할 때 상호 배척 자물쇠의 의미를 이해하고 자물쇠를 정확하게 잠그고 잠금을 해제하며 라인 사이의 집행 순서 문제, 그리고 조건 판단 문제, 마지막으로 서브 라인에 대한 회수도 이해해야 한다.

좋은 웹페이지 즐겨찾기