- 허용 함수
memset, printf, malloc, free, write, usleep, gettimeofday, pthtread_create, pthread_detach, pthread_join, pthread_mutex_init, pthread_mutex_destroy, pthread_mutex_lock, pthread_mutex_unlock
usleep
→ 지정한 마이크로 초 동안 대기 상태가 된다.
헤더: unistd.h
형태: void sleep( unsigned long useconds)
인수: unsigned long useconds 대기 마이크로 초
반환: -
예제
#include <stdio.h>
#include <unistd.h>
int main(void)
{
while( 1)
{
printf( "1초 마다 문자열 출력\\n");
usleep( 1000 * 1000 );
}
}
결과
./a.out
1초 마다 문자열 출력
1초 마다 문자열 출력
변환 초 받는-사람 마이크로초 (s → µs)
convertlive.com
gettimeofday
#include <sys/time.h>
int gettimeofday(struct timeval *tv, struct timezone *tz);
인수 : timezone 은 잘 사용되지 않아서 NULL로 주면됨, timeval 의 구조 다음과 같음
struct timeval {
time_t tv_sec;
suseconds_t tv_usec;
}
- 반환되는 값은 1970-01-01 00:00 부터 함수가 호출된 시간까지의 ms 값.’
- tv_sec 는 초, suseconds_t 는 마이크로초를 저장.
예제
#include <stdio.h>
#include <sys/time.h>
int main()
{
struct timeval startTime, endTime;
double diffTime;
gettimeofday(&startTime, NULL);
// 특정 작업 수행
sleep(1);
gettimeofday(&endTime, NULL);
printf("Seconds: %ld\\n", startTime.tv_sec); // 초 (1970년 1월 1일부터의 초)
printf("Microseconds: %ld\\n", startTime.tv_usec); // 마이크로초 (1000000분의 1초)
printf("entTime : Seconds: %ld\\n", endTime.tv_sec); // 초 (1970년 1월 1일부터의 초)
printf("entTime : Microseconds: %ld\\n", endTime.tv_usec); // 마이크로초 (1000000분의 1초)
diffTime = ( endTime.tv_sec - startTime.tv_sec ) + (( endTime.tv_usec - startTime.tv_usec ) / 1000000);
printf("%f s\\n", diffTime);
return 0;
}
결과
./a.out
Seconds: 1691658248
Microseconds: 512076
entTime : Seconds: 1691658249
entTime : Microseconds: 512402
1.000000 s
[C] gettimeofday 소스 수행 시간 차이 계산하기
[C] gettimeofday 소스 수행 시간 차이 계산하기
C 는 소스로직 중 특정구간의 수행시간 차이를 계산하기 위해 마이크로 단위의 시간 함수 gettimeofday 를 지원합니다. gettimeofday 함수 구조#include int gettimeofday(struct timeval *tv, struct timezone *tz);timezone
mozi.tistory.com
pthtread_create
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine)(void *), void *arg);
- 스레드를 생성하는 함수.
- 매개 변수
- 첫 번째 매개변수 -> 해당 변수에 스레드의 식별자 저장.
- 두 번째 매개변수 -> thread의 옵션을 지정할 때 사용. 기본적인 스레드의 옵션을 사용할 거라면 NULL을 사용.
- 세 번째 매개변수 -> pthread를 이용해서 분기 할 함수. 만들어진 스레드는 해당 함수만을 사용하게 됩니다.
- 네 번째 매개변수 -> 분기된 함수의 매개변수로 들어갑니다. void *의 형태이기 때문에 자료형의 구분이 없고, 분기될 함수 내에서 원하는 자료형으로 캐스팅이 필요합니다.
- 리턴 값 -> 스레드 생성 성공시 0을 리턴하고, 실패시 에러코드를 리턴합니다.
예제
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
void *pthread_ex(void *);
int main(){
int sts;
pthread_t thread_id;
void *t_return;
if((sts=pthread_create((&thread_id),NULL,pthread_ex,NULL))!=0){
perror("error\\n\\n");
exit(1);
}
printf("thread id %lx \\n",thread_id);
sleep(3);
return 0;
}
void *pthread_ex(void *arg)
{
int i=0;
while(i<10){
sleep(1);
printf("thread.. %d\\n",i);
i++;
}
}
결과
→ main문이 종료되어 쓰레드도 같이 종료됨 pthread_join을 통해 이것을 해결할 수 있음.
./a.out
thread id 7f6b9b01b640
thread.. 0
thread.. 1
pthread_join
int pthread_join(pthread_t th, void **thread_return);
- 용도만약 스레드가 종료되면 자원을 해제한다. 스레드는 종료된다고 모든 자원이 해제되지 않기 때문에 pthread_join을 통해서 자원을 해제해 주어야 메모리 누수가 발생하지 않는다.
- 지정한 스레드가 종료될 때까지 기다리는 함수.
- 매개변수
- 첫 번째 매개변수 -> 스레드의 TID
- 두 번째 매개변수 -> 만약 스레드 함수에서 리턴값이 있다면 **thread_return에 전달**됩니다. 없다면 NULL을 넣으시면 됩니다.
- 리턴 값 -> 성공시 0을 리턴하고 에러 발생시 에러코드를 리턴합니다.
예제
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
void *thread_ex(void *arg);
int main(){
int sts;
pthread_t thread_id;
void *t_return;
void** re;
sts=pthread_create(&thread_id,NULL,thread_ex,NULL);
printf("thread_id : %lx\\n",thread_id);
sleep(3);
pthread_join(thread_id,(void**)re);
//pthread_join(sts,(void**)re);
return 0;
}
void *thread_ex(void *arg){
int i=0;
while(i<10){
printf("threading %d\\n",i);
i++;
if(i==10)
exit(1);
}
}
결과
./a.out
thread_id : 7f04bf4fe640
threading 0
threading 1
threading 2
threading 3
threading 4
threading 5
threading 6
threading 7
threading 8
threading 9
pthread_detach
int pthread_detach( pthread_t th_id );
- 용도이 함수를 사용한 스레드는 pthread_join함수를 사용할 수 없고, 이 함수를 사용하지 않는다면 꼭 pthread_join을 사용해서 할당된 자원을 해제해야함.
- 이 함수를 사용한 스레드는 메인 스레드에서 분리되고, 스레드가 종료가 된다면 자원을 자동으로 해제해 준다.
- 매개변수 ->메인 스레드에서 분리할 스레드의 TID
- 리턴 값 -> 성공 시 0을 리턴하고 실패시 에러코드를 리턴합니다.
pthread_mutex_init
int pthread_mutex_init(pthread_mutex_t * mutex,
const pthread_mutex_attr *attr);
- 용도초기화에 성공하면 잠금이 해제된다.
- pthread_mutex_init은 뮤텍스 객체를 초기화하기 위해서 사용합니다.
- 매개변수
- 첫 번째 매개변수 -> 초기화 시킬 뮤텍스의 객체입니다.
- 두 번째 매개변수 -> 초기화 할 때 사용할 종류입니다.
- 리턴 값 -> 성공하면 0, 실패 시 에러코드를 반환합니다.
pthread_mutex_lock
- 함수 원형
int pthread_mutex_lock(pthread_mutex_t *mutex);
- 용도만약 잠금 해제 상태라면 잠그고 만약 잠긴 상태라면 해당 뮤텍스의 잠금이 해제될 때까지 기다리게 됩니다.
- 뮤텍스 잠금을 요청합니다.
- 매개변수 -> 잠글 뮤텍스 객체
- 리턴 값 -> 성공 시 0, 실패 시 에러코드를 반환합니다.
pthread_mutex_unlock
- 함수 원형
int pthread_mutex_unlock(pthread_mutex_t *mutex);
- 뮤텍스의 잠금을 해제합니다.
- 매개변수 -> 잠금을 해제할 뮤텍스 객체
- 리턴 값 -> 성공 시 0, 실패 시 에러코드를 반환합니다.
프로그램, 프로세스, 스레드에 대해서 알아보자
프로그램, 프로세스, 스레드에 대해서 알아보자
velog.io
스레드와 C언어 스레드 pthread
스레드 개념 스레드는 fork 함수가 하는 것처럼 자식 프로세스처럼 역할을 하지만 경량화된 형태이다. 새로운 프로세스에 비해 적은 비용으로 생성과 관리가 가능하다. 스레드는 하나의 실행 흐
codedatasotrage.tistory.com
'42Seoul > philsopheres' 카테고리의 다른 글
Philosophers 코드 (0) | 2023.09.11 |
---|---|
Philosophers 데이터레이스, 교착상태, 뮤텍스 (0) | 2023.09.11 |
philsopheres 문제 정리 (0) | 2023.09.11 |