Linux 다중 스레드 프로그래밍 예제 코드 분석
먼저 예를 들어보겠습니다. 숫자를 증가시키기 위해 두 개의 스레드를 만듭니다. 이 예는 실용적인 가치가 없을 수도 있지만 약간만 변경하면 다른 곳에서도 사용할 수 있습니다.
코드:
/*thread_example.c : c multiple thread programming in linux *author : falcon *e-mail : tunzhj03@st.lzu.edu.cn */ #include <pthread.h> #include <stdio.h> #include <sys/time.h> #include <string.h> #define max 10 pthread_t thread[2]; pthread_mutex_t mut; int number=0, i; void *thread1() { printf ("thread1 : i'm thread 1/n"); for (i = 0; i < max; i++) { printf("thread1 : number = %d/n",number); pthread_mutex_lock(&mut); number++; pthread_mutex_unlock(&mut); sleep(2); } printf("thread1 :主函数在等我完成任务吗?/n"); pthread_exit(null); } void *thread2() { printf("thread2 : i'm thread 2/n"); for (i = 0; i < max; i++) { printf("thread2 : number = %d/n",number); pthread_mutex_lock(&mut); number++; pthread_mutex_unlock(&mut); sleep(3); } printf("thread2 :主函数在等我完成任务吗?/n"); pthread_exit(null); } void thread_create(void) { int temp; memset(&thread, 0, sizeof(thread)); //comment1 /*创建线程*/ if((temp = pthread_create(&thread[0], null, thread1, null)) != 0) //comment2 printf("线程1创建失败!/n"); else printf("线程1被创建/n"); if((temp = pthread_create(&thread[1], null, thread2, null)) != 0) //comment3 printf("线程2创建失败"); else printf("线程2被创建/n"); } void thread_wait(void) { /*等待线程结束*/ if(thread[0] !=0) { //comment4 pthread_join(thread[0],null); printf("线程1已经结束/n"); } if(thread[1] !=0) { //comment5 pthread_join(thread[1],null); printf("线程2已经结束/n"); } } int main() { /*用默认属性初始化互斥锁*/ pthread_mutex_init(&mut,null); printf("我是主函数哦,我正在创建线程,呵呵/n"); thread_create(); printf("我是主函数哦,我正在等待线程完成任务阿,呵呵/n"); thread_wait(); return 0; }
먼저 컴파일하고 실행해 보겠습니다.
인용:
falcon@falcon:~/program/c/code/ftp$ gcc -lpthread -o thread_example thread_example.c falcon@falcon:~/program/c/code/ftp$ ./thread_example 我是主函数哦,我正在创建线程,呵呵 线程1被创建 线程2被创建 我是主函数哦,我正在等待线程完成任务阿,呵呵 thread1 : i'm thread 1 thread1 : number = 0 thread2 : i'm thread 2 thread2 : number = 1 thread1 : number = 2 thread2 : number = 3 thread1 : number = 4 thread2 : number = 5 thread1 : number = 6 thread1 : number = 7 thread2 : number = 8 thread1 : number = 9 thread2 : number = 10 thread1 :主函数在等我完成任务吗? 线程1已经结束 thread2 :主函数在等我完成任务吗? 线程2已经结束
이제 위 소개와 관련된 여러 함수와 변수를 인터넷에서 인용하겠습니다.
인용:
스레드 관련 작업
一 pthread_t
pthread_t는 /usr/include/bits/pthreadtypes.h 헤더 파일에 정의되어 있습니다.
typedef unsigned long int pthread_t;
스레드의 식별자입니다.
두 번째 pthread_create
pthread_create 함수는 스레드를 생성하는 데 사용됩니다. 해당 프로토타입은 다음과 같습니다.
extern int pthread_create __p ((pthread_t *__thread, __const pthread_attr_t *__attr,
void *(*__start_routine) (void *), void * __arg ));
첫 번째 매개변수는 스레드 식별자에 대한 포인터이고, 두 번째 매개변수는 스레드 속성을 설정하는 데 사용되며, 세 번째 매개변수는 스레드 실행 함수의 시작 주소이고, 마지막 매개변수는 실행 매개변수입니다. 기능. 여기서 함수 스레드에는 매개변수가 필요하지 않으므로 마지막 매개변수는 널 포인터로 설정됩니다. 또한 두 번째 매개변수를 널 포인터로 설정하여 기본 속성을 가진 스레드를 생성합니다. 다음 섹션에서는 스레드 속성의 설정 및 수정에 대해 설명하겠습니다. 스레드가 성공적으로 생성되면 함수는 0을 반환합니다. 0이 아니면 스레드 생성이 실패합니다. 일반적인 오류 반환 코드는 eagain 및 einval입니다. 전자는 시스템이 새로운 스레드 생성을 제한한다는 것을 의미합니다. 예를 들어 스레드 수가 너무 많다는 것은 두 번째 매개변수가 나타내는 스레드 속성 값이 불법임을 의미합니다. 스레드가 성공적으로 생성된 후 새로 생성된 스레드는 매개변수 3과 매개변수 4에 의해 결정된 함수를 실행하고 원래 스레드는 계속해서 다음 코드 줄을 실행합니다.
3개의 pthread_join pthread_exit
pthread_join 함수는 스레드의 끝을 기다리는 데 사용됩니다. 함수 프로토타입은 다음과 같습니다.
extern int pthread_join __p ((pthread_t __th, void **__thread_return));
첫 번째 매개변수는 대기할 스레드 식별자이고, 두 번째 매개변수는 사용할 수 있는 사용자 정의 포인터입니다. 기다리고 있는 스레드의 반환 값을 저장합니다. 이 함수는 스레드 차단 함수입니다. 이를 호출하는 함수는 대기 스레드가 끝날 때까지 대기합니다. 함수가 반환되면 대기 스레드의 리소스가 복구됩니다. 스레드를 종료하는 방법에는 두 가지가 있습니다. 하나는 위의 예와 같으며, 함수가 종료되면 이를 호출한 스레드도 종료됩니다. 함수 프로토타입은 다음과 같습니다.
extern void pthread_exit __p ((void *__retval)) __attribute__ ((__noreturn__));
유일한 매개 변수는 pthread_join의 두 번째 매개 변수 thread_return이 null이 아닌 한 함수의 반환 코드입니다. 값은 thread_return으로 전달됩니다. 마지막으로 주의할 점은 여러 스레드가 하나의 스레드를 기다릴 수 없다는 것입니다. 그렇지 않으면 신호를 수신한 첫 번째 스레드가 성공적으로 반환되고 pthread_join을 호출하는 나머지 스레드는 오류 코드 esrch를 반환합니다.
이 섹션에서는 가장 간단한 스레드를 작성하고 가장 일반적으로 사용되는 세 가지 함수인 pthread_create, pthread_join 및 pthread_exit를 마스터했습니다. 다음으로 스레드의 몇 가지 일반적인 속성과 이를 설정하는 방법을 살펴보겠습니다.
Mutex 잠금 관련
Mutex 잠금은 일정 시간 내에 하나의 스레드만 코드 조각을 실행하도록 하는 데 사용됩니다.
一 pthread_mutex_init
pthread_mutex_init 함수는 뮤텍스 잠금을 생성하는 데 사용됩니다. null 매개변수는 기본 속성이 사용됨을 나타냅니다. 특정 속성에 대한 뮤텍스를 선언해야 하는 경우 pthread_mutexattr_init 함수를 호출해야 합니다. pthread_mutexattr_setpshared 함수와 pthread_mutexattr_settype 함수는 뮤텍스 잠금 속성을 설정하는 데 사용됩니다. 이전 함수는 pthread_process_private 및 pthread_process_shared의 두 값을 갖는 pshared 속성을 설정합니다. 전자는 서로 다른 프로세스의 스레드를 동기화하는 데 사용되고 후자는 이 프로세스에서 서로 다른 스레드를 동기화하는 데 사용됩니다. 위의 예에서는 기본 속성 pthread_process_private을 사용하고 있습니다. 후자는 뮤텍스 잠금 유형을 설정하는 데 사용됩니다. 선택적 유형은 pthread_mutex_normal, pthread_mutex_errorcheck, pthread_mutex_recursive 및 pthread _mutex_default입니다. 이들은 각각 다른 목록 및 잠금 해제 메커니즘을 정의합니다. 일반적인 상황에서는 마지막 기본 속성이 선택됩니다.
두 개의 pthread_mutex_lock pthread_mutex_unlock pthread_delay_np
pthread_mutex_lock 문은 뮤텍스 잠금으로 잠기기 시작합니다. 후속 코드는 pthread_mutex_unlock이 호출될 때까지 잠깁니다. 즉, 동시에 하나의 스레드에서만 호출하고 실행할 수 있습니다. 스레드가 pthread_mutex_lock을 실행할 때 이때 다른 스레드가 잠금을 사용하고 있으면 해당 스레드는 차단됩니다. 즉, 프로그램은 다른 스레드가 뮤텍스 잠금을 해제할 때까지 대기합니다.
참고:
1 위의 두 가지 휴면은 데모 목적일 뿐만 아니라 스레드가 일정 시간 동안 휴면 상태를 유지하여 스레드가 뮤텍스 잠금을 해제하고 다른 스레드가 이 잠금을 사용할 때까지 기다릴 수 있도록 하기 위한 것입니다. 이 문제는 아래 참고문헌 1에 설명되어 있습니다. 그런데 Linux에는 pthread_delay_np 함수가 없는 것 같아서(해봤는데 정의된 함수에 대한 참조가 없다는 메시지가 표시됨) 대신 sleep을 사용했습니다. 그러나 참조 2에는 다른 방법이 나와 있는 것 같습니다. 이를 달성하는 방법을 제공하는 pthread_cond_timedwait로 대체되었습니다.
2 안에 있는 댓글 1~5를 주목해 주세요. 그것이 제가 알아내는 데 몇 시간이 걸린 문제입니다.
comment1, comment4, comment5가 없으면 pthread_join 시 segfault가 발생하므로, 위의 comment2, comment3이 근본 원인이므로 반드시 전체 코드를 작성해 주시기 바랍니다. 위의 스레드가 성공적으로 생성되지 않을 수 있으므로 스레드가 끝날 때까지 기다릴 수 없으며 pthread_join 사용 시 분할 오류(알 수 없는 메모리 영역에 접근)가 발생합니다. 게다가 memset을 사용할 때 string.h 헤더 파일을 포함시켜야 합니다
위 내용은 Linux 다중 스레드 프로그래밍 예제 코드 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Linux 터미널에서 Python 사용 ...

언어의 멀티 스레딩은 프로그램 효율성을 크게 향상시킬 수 있습니다. C 언어에서 멀티 스레딩을 구현하는 4 가지 주요 방법이 있습니다. 독립 프로세스 생성 : 여러 독립적으로 실행되는 프로세스 생성, 각 프로세스에는 자체 메모리 공간이 있습니다. 의사-다일리트 레딩 : 동일한 메모리 공간을 공유하고 교대로 실행하는 프로세스에서 여러 실행 스트림을 만듭니다. 멀티 스레드 라이브러리 : PTHREADS와 같은 멀티 스레드 라이브러리를 사용하여 스레드를 만들고 관리하여 풍부한 스레드 작동 기능을 제공합니다. COROUTINE : 작업을 작은 하위 작업으로 나누고 차례로 실행하는 가벼운 다중 스레드 구현.

Web.xml 파일을 열려면 다음 방법을 사용할 수 있습니다. 텍스트 편집기 (예 : 메모장 또는 문자 메시지)를 사용하여 통합 개발 환경 (예 : Eclipse 또는 NetBeans)을 사용하여 명령을 편집하십시오 (Windows : Notepad Web.xml; Mac/Linux : Open -A Texted web.xml).

Linux 시스템과 함께 제공되는 Python 통역사를 제거하는 문제와 관련하여 많은 Linux 배포판이 설치 될 때 Python 통역사를 사전 설치하고 패키지 관리자를 사용하지 않습니다 ...

Linux는 서버 관리, 임베디드 시스템 및 데스크탑 환경으로 사용되는 것이 가장 좋습니다. 1) 서버 관리에서 Linux는 웹 사이트, 데이터베이스 및 응용 프로그램을 호스팅하는 데 사용되어 안정성과 안정성을 제공합니다. 2) 임베디드 시스템에서 Linux는 유연성과 안정성으로 인해 스마트 홈 및 자동차 전자 시스템에서 널리 사용됩니다. 3) 데스크탑 환경에서 Linux는 풍부한 응용 프로그램과 효율적인 성능을 제공합니다.

Debianlinux는 안정성과 보안으로 유명하며 서버, 개발 및 데스크탑 환경에서 널리 사용됩니다. 현재 Debian 및 Hadoop과 직접 호환성에 대한 공식 지침이 부족하지만이 기사에서는 Debian 시스템에 Hadoop를 배포하는 방법을 안내합니다. 데비안 시스템 요구 사항 : Hadoop 구성을 시작하기 전에 Debian 시스템이 Hadoop의 최소 작동 요구 사항을 충족하는지 확인하십시오. 여기에는 필요한 JAVA 런타임 환경 (JRE) 및 Hadoop 패키지 설치가 포함됩니다. Hadoop 배포 단계 : 다운로드 및 unzip hadoop : 공식 Apachehadoop 웹 사이트에서 필요한 Hadoop 버전을 다운로드하여 해결하십시오.

GO를 사용하여 Oracle 데이터베이스에 연결할 때 Oracle 클라이언트를 설치해야합니까? GO에서 개발할 때 Oracle 데이터베이스에 연결하는 것이 일반적인 요구 사항입니다 ...

"Debiantrings"는 표준 용어가 아니며 구체적인 의미는 여전히 불분명합니다. 이 기사는 브라우저 호환성에 직접 언급 할 수 없습니다. 그러나 "Debiantrings"가 Debian 시스템에서 실행되는 웹 응용 프로그램을 지칭하는 경우 브라우저 호환성은 응용 프로그램 자체의 기술 아키텍처에 따라 다릅니다. 대부분의 최신 웹 응용 프로그램은 크로스 브라우저 호환성에 전념합니다. 이는 웹 표준에 따라 웹 표준과 잘 호환 가능한 프론트 엔드 기술 (예 : HTML, CSS, JavaScript) 및 백엔드 기술 (PHP, Python, Node.js 등)을 사용하는 데 의존합니다. 응용 프로그램이 여러 브라우저와 호환되도록 개발자는 종종 브라우저 크로스 테스트를 수행하고 응답 성을 사용해야합니다.
