c 언어 루틴 호환 잠금 실례
16628 단어 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);
}
}
}
소결
프로그래밍을 할 때 상호 배척 자물쇠의 의미를 이해하고 자물쇠를 정확하게 잠그고 잠금을 해제하며 라인 사이의 집행 순서 문제, 그리고 조건 판단 문제, 마지막으로 서브 라인에 대한 회수도 이해해야 한다.