1.
pthread_join을 사용하다가 join보다 더 괜찮은 것이 있다는 소식을 듣게 되었다.
그 이름은 'detach'
detach는 thread가 할일이 끝나면 알아서 자원을 해제하고 없어진다고 한다.
이것이 되는 근본적인 바탕은 detach 옵션을 주면 main thread와 sub thread가 분리되서 sub thread가 죽으면 그냥 해제되는 것이라고 한다.
2.
사용하는 방법은 2가지가 존재한다.
detach를 thread create하기 전에 설정할 것이냐, create한 후에 할 것이냐.
어떤것을 하던지간에 해제되긴 하지만 논리 순서상 깔금한 것은 pthread가 생성되기 전에 선언하는 것이다.
3.
두가지의 사용 방법.
(http://www.morenice.kr/75)
( copy : http://devkyu.tistory.com/entry/%ED%8E%8C-pthread-%EC%9E%90%EC%9B%90-%ED%95%B4%EC%A0%9C%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9D%B4%EC%95%BC%EA%B8%B0pthreaddetach-pthreadattrsetdetachstate )
4.
pthread를 생성하기 전에 설정하는 방법으로 여러개의 pthread를 생성할 때 pthread_attr_t가 어떻게 동작하는지 모르기 때문에 그것을 찾기로 한다.
5.
여러개의 thread를 생성할 때 pthread_attr_t 를 하나만 만들어서 여러개의 thread를 생성할 때 공유하게 설정해준다.
예제 소스는 아래와 같다. (이 사람은 이걸 알고 썼겠지.. 싶은데.. )
(http://stackoverflow.com/questions/10316266/single-threaded-and-multi-threaded-code-taking-the-same-time)
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <boost/progress.hpp>
#define SIZEEXEC 200000000
using namespace boost;
using std::cout;
using std::endl;
typedef struct t_d{
int intArg;
} Thread_data;
void* function(void *threadarg)
{
Thread_data *my_data= (Thread_data *) threadarg;
int size= my_data->intArg;
int i=0;
unsigned rand_state = 0;
for(i=0; i<size; i++) rand_r(&rand_state);
return 0;
}
void withOutThreads(void)
{
Thread_data* t1= new Thread_data();
t1->intArg= SIZEEXEC/3;
function((void *) t1);
Thread_data* t2= new Thread_data();
t2->intArg= SIZEEXEC/3;
function((void *) t2);
Thread_data* t3= new Thread_data();
t3->intArg= SIZEEXEC/3;
function((void *) t3);
}
void withThreads(void)
{
pthread_t* h1 = new pthread_t;
pthread_t* h2 = new pthread_t;
pthread_t* h3 = new pthread_t;
pthread_attr_t* atr = new pthread_attr_t;
pthread_attr_init(atr);
pthread_attr_setscope(atr,PTHREAD_SCOPE_SYSTEM);
Thread_data* t1= new Thread_data();
t1->intArg= SIZEEXEC/3;
pthread_create(h1,atr,function,(void *) t1);
Thread_data* t2= new Thread_data();
t2->intArg= SIZEEXEC/3;
pthread_create(h2,atr,function,(void *) t2);
Thread_data* t3= new Thread_data();
t3->intArg= SIZEEXEC/3;
pthread_create(h3,atr,function,(void *) t3);
pthread_join(*h1,0);
pthread_join(*h2,0);
pthread_join(*h3,0);
pthread_attr_destroy(atr);
delete h1;
delete h2;
delete h3;
delete atr;
}
int main(int argc, char *argv[])
{
bool multThread= bool(atoi(argv[1]));
if(!multThread){
cout << "NO THREADS" << endl;
progress_timer timer;
withOutThreads();
}
else {
cout << "WITH THREADS" << endl;
progress_timer timer;
withThreads();
}
return 0;
}
|
6.
일단 더 찾아봤다.
( http://docs.oracle.com/cd/E19455-01/806-5257/attrib-69011/index.html )
7.
5번 소스는 detachable한 thread는 joinable하지않는다는 말에 의해서 join을 제외하고 실험 하면서 적용하기록 결정.
끝.