cppkorea / cppconcurrencyinaction Goto Github PK
View Code? Open in Web Editor NEW2015년 하반기에 진행하는 C++ Concurrency in Action 스터디 관련 자료입니다.
2015년 하반기에 진행하는 C++ Concurrency in Action 스터디 관련 자료입니다.
전 잘 몰라서 무식하게 아래 처럼 접근 하였는데.. 좀더 보기 좋고 편한 방법이 있을까요?
((messaging::wrapped_message<std::string>*)(sPopString.get()))->contents
git push 하면 다음 에러가 뜨는데 write권한이 없는건가요?
remote: Permission to CppKorea/CppConcurrencyInAction.wiki.git denied to sedman.
fatal: unable to access 'https://github.com/CppKorea/CppConcurrencyInAction.wiki.git/': The requested URL returned error: 403
std::lock_guard() 를 사용하였을때 아래와 같이 사용하는것이 올바른 코드 작성 법 일까요?
std::mutex some_mutex;
void lockGuardTest()
{
std::lock_guard<std::mutex> guard(some_mutex);
some_mutex.unlock();
}
std::lock_guard() 를 사용한 이후에 std::mutex 를 unlock 이후 std::lock_guard 동작이 궁금해서 테스트 해 보았는데 이상없이 동작 하였습니다.
아래와 같은 이유 때문에 std::lock_guard 를 사용하는 걸까요?
그리고 std::lock_guard 와 std::unique_lock 이 있습니다.
std::lock_guard 는 멤버 함수가 없습니다. 그러면 std::lock_guard 는 선언 이후에 별다른 처리를 못하고 소멸자가 unlock 을 자동으로 해주는 기능만 있는거 같습니다.
그에 반해 std::unique_lock 은 멤버 함수가 존재 합니다. 여러 operation(lock, unlock) 을 수행 할수 있습니다.
그러면 std::lock _guard는 함수 단위로 lock 를 걸때 사용해야 할까요?
(java 에서 함수명에 synchronize 를 붙이는것 처럼)
http://en.cppreference.com/w/cpp/thread/lock_guard
http://en.cppreference.com/w/cpp/thread/unique_lock
조건 변수의 wait 멤버 변수에서 pred 관련 동작이 궁금 하여서 몇가지 테스트를 하여 보았습니다.
template< class Predicate >
void wait( std::unique_lockstd::mutex& lock, Predicate pred );
Listing_C_01.cpp 에서의 큐 부분 입니다.
// Our message queue
class queue
{
std::mutex m;
std::condition_variable c;
// Actual queue stores pointer to message_base
std::queue<std::shared_ptr<message_base> > q;
public:
template<typename T>
void push(T const& msg)
{
std::lock_guard<std::mutex> lk(m);
// Wrap posted message and store pointer
q.push(std::make_shared<wrapped_message<T> >(msg));
c.notify_all();
}
std::shared_ptr<message_base> wait_and_pop()
{
std::unique_lock<std::mutex> lk(m);
// Block until queue isn't empty
c.wait(lk,[&]{return !q.empty();});
auto res=q.front();
q.pop();
return res;
}
}; // class queue
테스트 코드
int main( void )
{
messaging::queue sQueue;
std::string sPushString( "1234" );
std::shared_ptr<messaging::message_base> sPopString;
sQueue.push( sPushString );
sPopString = sQueue.wait_and_pop();
std::cout << ((messaging::wrapped_message<std::string>*)(sPopString.get()))->contents << std::endl;
return 0;
}
제가 생각 하였을때는 wait 함수 내부에서 signal 를 받고 pred 함수의 반환이 true 가 되면 wait 의 block 을 풀어줄것이라고 생각하였는데 실제로는 wait 함수 들어 가면서 pred 함수를 확인해보고 시그널을 대기여부를 판단하는것 같습니다.
그리고 push 함수 안에 실재 데이터 q.push 부분을 지워 주면 signal 이 발생하더라도 wait 함수의 block 은 풀리지 않습니다.
또한 pred 조건을 만족 시키고 signal 을 발생시키지 않으면 wait 을 block 에서 풀리지 않습니다.
// 바로 위 테스트 코드 입니다.
// pred 조건을 만족 시키고 signal 을 발생시키지 않으면 wait 을 block 에서 풀리지 않습니다
void t1( messaging::queue * aQueue )
{
std::string sPushString( "1234" );
while( gContinue == 1 )
{
}
sleep( 5 );
std::cout << "Push : " << sPushString << std::endl;
aQueue->push( sPushString );
}
void t2( messaging::queue * aQueue )
{
std::shared_ptr<messaging::message_base> sPopString;
gContinue = 1;
std::cout << "wait Pop" << std::endl;
sPopString = aQueue->wait_and_pop();
std::cout << ((messaging::wrapped_message<std::string>*)(sPopString.get()))->contents << std::endl;
}
int main( void )
{
messaging::queue sQueue;
gContinue = 0;
std::thread thread1( t1, &sQueue );
std::thread thread2( t2, &sQueue );
thread1.join();
thread2.join();
return 0;
}
그래서 결론은 wait 함수의 동작은 아래 정도로 정리 할수 있을것 같습니다.
아까 luncliff 님에게 signal Lost 가 발생 할것 같다라고 말씀 드렸었는데
2번 항목때문에 signal Lost 를 발생하지 않습니다.
c++11 이전에는 2번 부분을 감안해서 코딩해 줘야 했었는데 언어 자체에서 지원해주네요..
참 아쉽네요. 이런 스터디가 있었다는걸 몰랐어요.
본 책을 틈틈히 읽어보려고 합니다.
아무래도 혼자 보려고 하니 질문 거리가 있을 수 있는데요.
혹시 관련하여 대답을 해주실 멤버가 계신가요? :-)
가능하시다면 어떻게 소통할 수 있을까요?
오늘이나 내일 쯤 폴더를 정리할 예정입니다.
소스 코드와 발표 자료를 분리해서 게시할 수 있도록 분리할 생각입니다.
If you are relying on the library for automatic [scaling],
만약 당신이 자동적인 [코드의 크기 조정]을 위해 라이브러리에 의존하고 있다면,
교재 96쪽 중단 쯤, 단락 마지막에 나오는 표현인데, 이렇게 해석하는게 적합할지 조언을 구하고 싶습니다.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.