프로그래밍33 c++ 배워보기(1) 나는 프로그래밍 언어의 첫시작을 go언어를 사용하였다. go는 간단하고 파워풀했지만, 아직은 마이너한 언어이고 특정 분야에 특화된 언어였다. 그러는 와중, 팀내에서 kernel을 eBPF를 사용하여서 service를 구현하는 경우가 많아지고 있고, 그에따라서 c++의 학습의 필요성을 느끼고 있다. 그래서 c++를 공부하기 시작하였는데, go에 비해서 훨씬 다양한 기능을 제공하고 공부해야되는 부분도 많았다. 나는 기존의 학습된 내용을 기반으로 추가적으로 무엇이 다른지, 정리를 하면서 공부하고 싶어서 이렇게 내용을 정리하고자 한다. 패키지 호출 go의 경우, package이름을 자동으로 넣어주고 내부에 있는 함수를 package.function의 형태로 호출한다. c++의 경우, 코드의 처음부분에 #incl.. 2023. 3. 8. ultimate go-(12) context사용 context context패키지를 이용해보자 cancellation과 deadline을 지원한다. package main import ( "context" "fmt" ) type user struct { // context내에 값을 저장하기 위해 만든 구조체 name string } type userKey int // user값에 대한 키 타입 func main() u := user { //user값 생성 name: "Hoanh", } const uk userKey = 0 //key값 0으로 생성 ctx := context.WithValue(context.Background(), uk, &u) // value를 넣기위한 함수 withValue, 키값과 키값으로 찾을 값의 주소값을 저장한다. // con.. 2023. 1. 31. ultimate in go-(11) 채널 채널 채널의 동작 원리 채널은 오케스트레이션을 위해서 존재한다. 채널을 통해서 고루틴간에 워크플로우를 정해줄 수 있다. 큐처럼 fifo로 처리되지만, 큐가 아닌 이벤트 발생을 알려주는 신호라고 생각하는게 맞다. 물론 데이터 없이도 신호를 줄 수 있다(close를 통해서) 채널은 2종류가 있다. buffer가 없는 채널 buffer가 있는 채널 buffer가 없는 채널 데이터가 전달되었다는 것을 보장 받을 수 있다. 대신 좀더 느리다. 채널에는 신호를 주는 고루틴과 데이터를 보내는 고루틴이 있고 데이터를 보내고 신호를 보내는데, 신호가 응답이 없으면 데이터는 lock상태가 되고, 신호가 올때까지 대기한다. buffer가 있는 채널 데이터가 전달 되었다는 것을 보장 받을 수 없다. 대신 빠르다. 데이터를 넣.. 2023. 1. 29. ultimate in go-(10) data race Data race race detection 프로그램에 고루틴을 추가하면 복잡도가 올라간다. 프로그램의 모든 과정이 stateless할 수 없기때문에, 서로간에 순서나 정보가 중요하게된다. 3가지 선택지가 있다. waitGroup같은 메모리 공유 패키지를 이용하는 것 서로간에 합리적으로 작동하도록 만드는 것(atomic하게) 채널을 이용하는것 atomic한게 가장 빠르고, 메모리를 공유하는게 다음으로, 제일 느린것은 채널이다. 물론 성능에 큰이슈가 없으면 채널을 쓰는게 베스트라고 생각한다(개인적 견해) package main import ( "fmt" "runtime" "sync" ) var counter int func main() { const grs = 2 var wg sync.WaitGroup /.. 2023. 1. 29. 이전 1 2 3 4 5 ··· 9 다음