반응형
- 허용 함수
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초 마다 문자열 출력
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 소스 수행 시간 차이 계산하기
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, 실패 시 에러코드를 반환합니다.
반응형
'42Seoul > philsopheres' 카테고리의 다른 글
Philosophers 코드 (0) | 2023.09.11 |
---|---|
Philosophers 데이터레이스, 교착상태, 뮤텍스 (0) | 2023.09.11 |
philsopheres 문제 정리 (0) | 2023.09.11 |