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

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

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

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

@ -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