mutex / condition_variable test

main
Yik Teng Hie 3 years ago
parent 66f95ad377
commit 3ed77f3e11

@ -0,0 +1,18 @@
#include "CRunServer.h"
#include <mutex>
extern std::mutex mutex_;
extern std::condition_variable condVar;
extern bool dataReady;
CRunServer::CRunServer()
{
}
void CRunServer::Auto()
{
std::cout << "Server Started..." << std::endl;
std::unique_lock<std::mutex> lck(mutex_);
condVar.wait(lck, [] { return dataReady; }); // (4)
}

@ -0,0 +1,11 @@
#pragma once
#include "Run.h"
class CRunServer :
public Run
{
public:
CRunServer();
void Auto() override;
};

@ -3,14 +3,26 @@
#include <iostream> #include <iostream>
#include ".\Run.h" #include ".\Run.h"
#include "CRunServer.h"
#include "RunClient.h"
#include <mutex>
std::mutex mutex_;
std::condition_variable condVar;
bool dataReady{ false };
int main() int main()
{ {
Run r1(20); Run r1(20);
Run r2(10); Run r2(10);
CRunServer server;
CRunClient client;
char input = '0'; char input = '0';
r2.setState(AUTO); r2.setState(AUTO);
server.setState(AUTO);
client.setState(AUTO);
std::cout << "Hello World!\n"; std::cout << "Hello World!\n";
std::cout << "Hello World!\n"; std::cout << "Hello World!\n";
std::cout << "Hello World!\n"; std::cout << "Hello World!\n";
@ -30,6 +42,11 @@ int main()
r1.WaitThreadTerminate(); r1.WaitThreadTerminate();
r2.WaitThreadTerminate(); r2.WaitThreadTerminate();
server.EndTask();
client.EndTask();
server.WaitThreadTerminate();
client.WaitThreadTerminate();
std::cout << "All Terminated!\n"; std::cout << "All Terminated!\n";
} }

@ -128,10 +128,14 @@
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="ControlApp.cpp" /> <ClCompile Include="ControlApp.cpp" />
<ClCompile Include="CRunServer.cpp" />
<ClCompile Include="Run.cpp" /> <ClCompile Include="Run.cpp" />
<ClCompile Include="RunClient.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="CRunServer.h" />
<ClInclude Include="Run.h" /> <ClInclude Include="Run.h" />
<ClInclude Include="RunClient.h" />
</ItemGroup> </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">

@ -21,10 +21,22 @@
<ClCompile Include="Run.cpp"> <ClCompile Include="Run.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="CRunServer.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="RunClient.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="Run.h"> <ClInclude Include="Run.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="CRunServer.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="RunClient.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
</Project> </Project>

@ -7,14 +7,14 @@ Run::Run(int count) {
m_bHalt = false; m_bHalt = false;
m_state = IDLE; m_state = IDLE;
//m_myThread = std::thread(&Run::DoTask, this); m_myThread = std::thread(&Run::DoTask, this);
// assign a member function of a class // assign a member function of a class
// @link https://thispointer.com//c11-multithreading-part-3-carefully-pass-arguments-to-threads/ // @link https://thispointer.com//c11-multithreading-part-3-carefully-pass-arguments-to-threads/
//new_thread dummyObj; //new_thread dummyObj;
//m_myThread = std::thread(&new_thread::operator(), &dummyObj, 1); //m_myThread = std::thread(&new_thread::operator(), &dummyObj, 1);
m_myThread = std::thread(new_thread(), count); //m_myThread = std::thread(new_thread(), count);
} }
Run::~Run() Run::~Run()

@ -0,0 +1,22 @@
#include "RunClient.h"
#include <mutex>
extern std::mutex mutex_;
extern std::condition_variable condVar;
extern bool dataReady;
CRunClient::CRunClient()
{
}
void CRunClient::Auto()
{
std::cout << "Client Started" << std::endl;
{
std::lock_guard<std::mutex> lck(mutex_);
dataReady = true;
}
std::cout << "Data prepared" << std::endl;
condVar.notify_one();
}

@ -0,0 +1,11 @@
#pragma once
#include "Run.h"
class CRunClient :
public Run
{
public:
CRunClient();
void Auto();
};
Loading…
Cancel
Save