반응형

cpp thread

include <thread>


+간단한 thread 예

void func() { cout << "aaa" << endl ; }


thread t(&func) ; // func함수가 쓰레드로 실행.

t.join() ;    // thread t가 종료 될때 까지 기다림.


+ thread 함수에 파라미터 주기

void func(int x) {..} ;

thread t1(&func, 10) ;

thread t2(&func, 20) ;

t1.join() ;

t2.join() ;


+global 변수를 다중 thread로 카운팅하기

std::atomic<int> global_cnt(0) ;    // atomic 하게 작업.

void increase_global(int n) { 

   for (int i=0; i<n; i++) ++global_cnt; 

}

std::vector<std::thread> threads ;

for (int i=0; i<5; i++)

   threads.push_back( std::thread( increase_global, 100) ) ;

// 5개의 쓰레드로 100번씩 돌림. global_cnt=>500


+다른 방식

void increase_ref(std::atomic<int> &v , int n) {

   for (int i=0; i<n; i++) ++v; 

}

std::atomic<int> foo(0) ;

for (int i=0; i<5; i++)

   threads.push_back( std::thread( increase_ref, std::ref(foo), 100) ) ;

// 5개의 쓰레드로 100번씩 돌림. foo=500



+ main thread인지 아닌지 체크
std::thread::id main_thread_id = std::this_thread::get_id() ;    // thread id 얻기

void is_main_thread() {
if ( main_thread_id == std::this_thread::get_id() ) { cout << "Main thread" << endl ;}
else { cout <<"not main thread" << endl ; }
}

is_main_thread();
std::thread t (is_main_thread) ;
t.join() ;





'Develop > C&CPP' 카테고리의 다른 글

cstring  (0) 2018.06.11
thread mutex  (0) 2018.06.10
utility  (0) 2018.06.08
fstream 1 basic_ifstream  (0) 2018.06.07
functional 1 plus,minus,bind1st, bind2nd, equal_to, greater  (0) 2018.06.07
반응형

cpp utility

include <utility>


+swap ; 두 객체의 값들을 바꾼다.

int x=10, y=20 ;

std::swap(x,y) ;    // x=20, y=10


int foo[4] ;

int bar[]={1,2,3,4} ;

std::swap(foo, bar) ;    // foo=1,2,3,4


+make_pair ; 두 객체를 pair로 만들어 리턴한다. 타입이 맞지 않으면 알아서 컨버팅 해준다.

std::pair<int,int> foo ;

foo = std::make_pair(10,20) ;

// access value: foo.first, foo.second



'Develop > C&CPP' 카테고리의 다른 글

thread mutex  (0) 2018.06.10
thread  (0) 2018.06.09
fstream 1 basic_ifstream  (0) 2018.06.07
functional 1 plus,minus,bind1st, bind2nd, equal_to, greater  (0) 2018.06.07
algorithm 4 merge, heap, min, max  (0) 2018.06.06
반응형

cpp fstream

include <fstream>


++ basic_ifstream

Input file stream

ios_base <- basic_ios <- basic_istream <- basic_ifstream


+constructor

explicit basic_ifstream(const char * filename, ios_base::openmode mode=ios_base::in) ;

const char *filename 대신 const string &filename도 지원.

ex)

std::ifstream ifs("test.txt", std::ifstream::in) ;

char c = ifs.get() ;

or

std::ifstream ifs ;

ifs.open( "test.txt", std::ifstream::in) ;

char c = ifs.get() ;


+ bool is_open() const ;  // 파일이 열려있는지 체크. true/false

+ void close() ;    // file close


+operator >>

스트림에서 타입에 맞게 읽음.

int n ;

std::cin >> n ;


+get

int_type get() ;

basic_istream& get(char_type &c) ;

basic_istream& get(char_type *s, streamsize n) ;    // n-1까지 읽음. 마지막은 null

basic_istream& get(char_type *s, streamsize n, char_type delim) ;


char str[256] ;
std::cin.get(str, 256) ;


+getline()
라인을 읽음 또는 구분자 까지 읽음.  버퍼크기는 null을 포함한 크기로 지정.
getline(char_type *s, streamsize n) ;
getline(char_type *s, streamsize n, char_type dilim) ;

std::cin.getline(name, 256) ;

+read()

null 체크없이 무조건 크기대로 읽음. 

read(char_type *s, streamsize n) ;

ex)

std::ifstream is("test.txt", std::ifstream::binary) ;

if ( is ) {

   is.seekg(0, is.end) ;    // move to last

 int length = is.tellg();    // file size

is.seekg(0, is.beg) ;    // move to first


char *buf = new char[length] ;

is.read(buf, length) ;

if ( is ) // read ok

else // read only is.gcount() ;

is.close() ;

delete[] buf;

}


+gcount() ; 읽은 데이터 크기

input operation이 읽은 데이터 크기.

std::cin.getline(str, 20) ;

std::cin.gcount() ;    // 실제 읽은 데이터 크기.


+ignore() ; 데이터를 읽고 버림.

ignore(streamsize n=1, int_type delim) ;

n개의 문자가 추출되거나 delim일 때까지 읽고 버림.


+peek() ; 다음 문자를 읽어 리턴하지만 스트림에서 뽑아내지는 않고 내비둠.

ex) 수 또는 문자열 읽기

std::cout << "input number or wrod:";

std::cout.flush() ;    // ouput 버퍼 출력하여 비움.


std::cin >> std::ws ;     // 앞에오는 white space를 지움

std::istream::int_type c ;

c = std::cin.peek() ;    // 문자 한 개를 미리 보기.

if ( c==std::char_traits<char>::eof() ) return 1 ;    // eof

if ( std::isdigit( c ) ) {

int n ;

std::cin >> n ;

} else {

std::string str ;

std::cin >> str ;

}


+putback(char_type c)

문자 하나를 버퍼에 집어 넣고, 마지막 추출 위치를 back 시킨다.

위의 예제와 동일한 기능을 다음과 같이 사용할 수  있다.

char c = std::cin.get() ;

if ( (c>='0') && (c<='9') ) {

   int n ;

   std::cin.putback(c) ;    // 또는 std.cin.unget() ;

   std::cin >> n ;

}


+ tellg    / tellp

tellg ; 입력스트림에서 현재의 위치를 리턴한다. (파일 오프셋이 마지막에 있으면 파일 크기가 된다.)

tellp ; 출력 스트림에서는 tellp를 쓴다. 

is.seekg(0, is.end ) ;

int filesize = is.tellg() ;


+seekg / seekp

seekg ; 입력 스트림에서 추출할 다음 문자 위치를 지정한다.

seekp ; 출력 스트림에서는 seekp를 쓴다.

seekg(pos_type pos) ;    // 시작 위치 기준으로 위치.

seekg(off_type off, ios_base::seekdir_way) ;    // 상대 위치, 기준.

seekdir_way ; ios_base::beg, ios_base::cur, ios_base::end


std::ofstream outfile ;

outfile.open("test.txt") ;

outfile.write("This is an apple", 16) ;

long pos = outfile.tellp() ;    // file size ; 16. ==> point <EOF>

outfile.seekp(pos-7) ;    // ==> point 'n'

outfile.write(" sam", 4) ;

outfile.close() ;    // => This is a sample












'Develop > C&CPP' 카테고리의 다른 글

thread  (0) 2018.06.09
utility  (0) 2018.06.08
functional 1 plus,minus,bind1st, bind2nd, equal_to, greater  (0) 2018.06.07
algorithm 4 merge, heap, min, max  (0) 2018.06.06
alrorigthm 3 partition, sort, search  (0) 2018.06.05

+ Recent posts