no message

master
zcy 2021-11-25 16:56:43 +08:00
parent 88ce90857a
commit 9a96adcd07
7 changed files with 211 additions and 45 deletions

View File

@ -4,10 +4,11 @@ add_definitions(-std=c++11)
set(CMAKE_BUILD_TYPE DEBUG) set(CMAKE_BUILD_TYPE DEBUG)
set(CMAKE_CXX_FLAGS " /MTd ") set(CMAKE_CXX_FLAGS " /MDd ")
set(CMAKE_CXX_FLAGS_DEBUG "/DEBUG") set(CMAKE_CXX_FLAGS_DEBUG "/DEBUG")
set(CMAKE_CXX_FLAGS_RELEASE "") set(CMAKE_CXX_FLAGS_RELEASE "")
message("current dir" ${CMAKE_CURRENT_SOURCE_DIR}) message("current dir" ${CMAKE_CURRENT_SOURCE_DIR})
message(info ${SOURCE}) message(info ${SOURCE})
link_directories("./third/jsoncpp/lib/") link_directories("./third/jsoncpp/lib/")
@ -16,11 +17,13 @@ link_directories("./third/gtest/lib")
link_libraries(generallib) link_libraries(generallib)
link_libraries(gtestd) link_libraries(gtestd)
link_libraries(jsoncpp)
add_executable(cpp11 cpp11_test.cpp ) add_executable(cpp11 cpp11_test.cpp )
add_executable(gtest gtest.cpp ) add_executable(gtest gtest.cpp )
add_executable(thread_test thread_usage.cpp threadpool.cpp)
include_directories("./third/jsoncpp/include/pkgsrc/include/json") include_directories("./third/jsoncpp/include/json")
include_directories("../../../obj/inc/") include_directories("../../../obj/inc/")
include_directories("./third/gtest/include") include_directories("./third/gtest/include")

View File

@ -1,7 +1,7 @@
/* /*
* @Author: your name * @Author: your name
* @Date: 2021-03-15 23:07:25 * @Date: 2021-03-15 23:07:25
* @LastEditTime: 2021-11-18 11:14:15 * @LastEditTime: 2021-11-23 11:29:15
* @LastEditors: Please set LastEditors * @LastEditors: Please set LastEditors
* @Description: In User Settings Edit * @Description: In User Settings Edit
* @FilePath: \cpp11\cpp11_test.cpp * @FilePath: \cpp11\cpp11_test.cpp
@ -43,7 +43,7 @@ int main(int argc, char **argv)
}); });
auto x = ip.Front(); auto x = ip.Front();
std::cout<<*x<<"\r\n"; std::cout<<*x<<"\r\n";
std::cout<<ip.PopFrontAndWait()<<"\r\n"; std::cout<<ip.PopFrontAndWait()<<"\r\n";
std::cout<<ip.PopFrontAndWait()<<"\r\n"; std::cout<<ip.PopFrontAndWait()<<"\r\n";

35
test/src/cpp11/gtest.cpp Normal file
View File

@ -0,0 +1,35 @@
/*
* @Author: your name
* @Date: 2021-11-18 14:07:21
* @LastEditTime: 2021-11-18 14:43:21
* @LastEditors: Please set LastEditors
* @Description: <EFBFBD><EFBFBD>koroFileHeader<EFBFBD><EFBFBD><EFBFBD> 𥡝??: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
* @FilePath: \cpp11\gtest.cpp
*/
#include "gtest/gtest.h"
int Foo(int a,int b) {
if(a==0||b==0)
{
throw"don'tdothat";
}
int c = a % b;
if(c == 0)
return b;
return Foo(b,c);
}
TEST(FooTest,HandleZeroInput)
{
EXPECT_ANY_THROW(Foo(10,0));
EXPECT_THROW(Foo(0,5),char*);
}
int main(int argc, char* argv[])
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}

View File

@ -7,7 +7,7 @@ void thread_set_promise(std::promise<int>& promiseObj) {
std::cout<<"end"<<std::endl; std::cout<<"end"<<std::endl;
} }
void TestPromiseFutureBefore(){ void TestPromiseFutureBefore() {
std::promise<int> promiseObj; std::promise<int> promiseObj;
std::future<int> futureObj = promiseObj.get_future(); std::future<int> futureObj = promiseObj.get_future();
std::thread t(&thread_set_promise, std::ref(promiseObj)); std::thread t(&thread_set_promise, std::ref(promiseObj));
@ -21,8 +21,7 @@ void TestPromiseFutureBefore(){
t.join(); t.join();
} }
void independentThread() void independentThread() {
{
std::cout << "Starting concurrent thread.\n"; std::cout << "Starting concurrent thread.\n";
std::this_thread::sleep_for(std::chrono::seconds(2)); std::this_thread::sleep_for(std::chrono::seconds(2));
std::cout << "Exiting concurrent thread.\n"; std::cout << "Exiting concurrent thread.\n";
@ -56,7 +55,7 @@ void print_thread_id (int id) {
} }
} }
void TestLockGuard(){ void TestLockGuard() {
std::thread threads[10]; std::thread threads[10];
// spawn 10 threads: // spawn 10 threads:
for (int i=0; i<10; ++i) for (int i=0; i<10; ++i)
@ -71,7 +70,7 @@ std::mutex cMtx; // 全局互斥锁.
std::condition_variable gCv; // 全局条件变量. std::condition_variable gCv; // 全局条件变量.
bool gReady = false; // 全局标志位. bool gReady = false; // 全局标志位.
void do_print_id(int id){ void do_print_id(int id) {
std::unique_lock <std::mutex> lck(cMtx); std::unique_lock <std::mutex> lck(cMtx);
while (!gReady) while (!gReady)
gCv.wait(lck); // 当前线程被阻塞, 当全局标志位变为 true 之后, gCv.wait(lck); // 当前线程被阻塞, 当全局标志位变为 true 之后,
@ -82,7 +81,6 @@ void do_print_id(int id){
void go(){ void go(){
gReady = true; gReady = true;
gCv.notify_all(); // 唤醒所有线程. gCv.notify_all(); // 唤醒所有线程.
} }
int TestConditionVariable() { int TestConditionVariable() {
@ -91,16 +89,14 @@ int TestConditionVariable() {
for (int i = 0; i < 10; ++i) for (int i = 0; i < 10; ++i)
threads[i] = std::thread(do_print_id, i); threads[i] = std::thread(do_print_id, i);
std::cout << "10 threads ready to race...\n"; std::cout << "10 threads ready to race...\n";
go(); go();
for (auto & th:threads) for (auto & th:threads)
th.join(); th.join();
return 0; return 0;
} }
class TestClass class TestClass {
{
public: public:
TestClass() : num(new int(0)) TestClass() : num(new int(0))
{ {
@ -119,17 +115,18 @@ public:
private: private:
int *num; int *num;
}; };
TestClass get_demo()
{ TestClass get_demo() {
return TestClass(); return TestClass();
} }
int TestOptiomization()
{ int TestOptiomization() {
TestClass a = get_demo(); TestClass a = get_demo();
return 0; return 0;
} }
int TestRValue()
{
int TestRValue() {
std::string str = "Hello"; std::string str = "Hello";
std::vector<std::string> v; std::vector<std::string> v;
//调用常规的拷贝构造函数,新建字符数组,拷贝数据 //调用常规的拷贝构造函数,新建字符数组,拷贝数据
@ -143,8 +140,7 @@ int TestRValue()
} }
int global = 0; int global = 0;
class TestTask : public general::Task class TestTask : public general::Task {
{
public: public:
void Run() void Run()
{ {
@ -163,17 +159,22 @@ public:
reader.parse(strValue, root); reader.parse(strValue, root);
reader1.parse(strValue, root1); reader1.parse(strValue, root1);
reader2.parse(strValue, root2); reader2.parse(strValue, root2);
} }
auto t2 = std::chrono::steady_clock::now(); auto t2 = std::chrono::steady_clock::now();
double dr_ms = std::chrono::duration<double,std::milli>(t2-t1).count(); double dr_ms = std::chrono::duration<double,std::milli>(t2-t1).count();
std::cout<<"expired is "<<dr_ms<<std::endl; std::cout<<"expired is "<<dr_ms<<std::endl;
} }
void OnDone(){
std::cout<<"the work is done"<<std::endl;
}
}; };
// 42973.6 // 42973.6
// 42942.3 // 42942.3
int TestThreadPool() int TestThreadPool() {
{
//run code //run code
TestTask *t = new TestTask; TestTask *t = new TestTask;
general::ThreadPool pool(3); general::ThreadPool pool(3);
@ -195,3 +196,102 @@ int TestThreadPool()
return 0; return 0;
} }
atomic<int> a{0};
atomic<int> b{0};
void ValueSet(int)
{
a.store(0,memory_order_relaxed);
b.store(0,memory_order_relaxed);
for(int i = 0;i < 100;i++){
int t=1;
a.store(t,memory_order_relaxed);
b.store(2,memory_order_relaxed);
}
}
void Observer(int)
{
while(b.load(memory_order_relaxed)!=2);//自旋等待
cout<<a.load(memory_order_relaxed)<<endl;
cout<<"("<<a<<","<<b<<")"<<endl;//可能有多种输出
}
using namespace std;
std::atomic_llong total{ 0 };//原子数据类型
//int total{ 0 };
void func(int)
{
for (long long i = 0; i<1000000000LL; ++i)
{
total += 1;
}
}
void test_function(std::function<int(int)> t1) {
t1(1);
}
int TestFuntionParadim() {
return 0;
}
// 一个异步线程的封装
template<typename T>
class ASyncProcess {
public:
ASyncProcess(T t){
std::cout<<"ASyncProcess construct"<<std::endl;
mThread = new std::thread([&](){
this->Run();
this->Done(t);
});
}
bool Finish(){
return m_finish;
}
virtual void Run() {
std::cout<<"ASyncProcess::Run()"<<std::endl;
};
virtual void Done(T t) {
std::cout<<"ASyncProcess::Done()"<<std::endl;
};
virtual ~ASyncProcess(){
mThread->detach();
}
private:
bool m_finish;
std::thread *mThread;
};
class TestProcess : public ASyncProcess<int>{
public:
TestProcess(int x )
:ASyncProcess<int>(x)
{
}
void Run(){
Sleep(5000);
std::cout<<"ASyncProcess\r\n";
}
void Done(int i){
std::cout<<"Done\r\n";
i = 4;
}
};
int main()
{
TestFuntionParadim();
int j =111;
int &x = j;
TestProcess p1(x);
getchar();
std::cout<<x<<std::endl;
}

View File

@ -1,3 +1,11 @@
/*
* @Author: your name
* @Date: 2021-10-09 10:03:45
* @LastEditTime: 2021-11-25 16:43:43
* @LastEditors: Please set LastEditors
* @Description: koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
* @FilePath: \cpp11\thread_usage.h
*/
#pragma once #pragma once
#include <cstdint> #include <cstdint>
@ -9,7 +17,19 @@
#include <cstdlib> #include <cstdlib>
#include <vector> #include <vector>
#include "threadpool.h" #include "threadpool.h"
#include "third\jsoncpp\include\pkgsrc\include\json\json.h" #include "json.h"
#include<atomic>
#include<thread>
#include<iostream>
#include <Windows.h>
#include <thread>
#include <atomic>
#include <iostream>
#include <objbase.h>
#include <functional>
#include <tuple>
using namespace std;
void TestPromiseFutureBefore(); void TestPromiseFutureBefore();
void TestThreadDetach(); void TestThreadDetach();
@ -17,4 +37,5 @@ void TestLockGuard();
int TestConditionVariable(); int TestConditionVariable();
int TestOptiomization(); int TestOptiomization();
int TestRValue(); int TestRValue();
int TestThreadPool(); int TestThreadPool();
int TestFuntionParadim();

View File

@ -16,14 +16,13 @@ unsigned int CoreCount()
namespace general{ namespace general{
CThreadPool::CThreadPool(int num) CThreadPool::CThreadPool(int num) {
{
this->mThreadCnt = num; this->mThreadCnt = num;
mStarted = false; mStarted = false;
} }
int CThreadPool::AddTask(Task *t){ int CThreadPool::AddTask(Task *t) {
if ( nullptr == t){ if ( nullptr == t){
return -1; return -1;
} }
@ -39,7 +38,7 @@ namespace general{
} }
} }
void CThreadPool::Start(){ void CThreadPool::Start() {
mStarted = true; mStarted = true;
mThreads.reserve(this->mThreadCnt); mThreads.reserve(this->mThreadCnt);
for (int i = 0; i < mThreadCnt; i++) for (int i = 0; i < mThreadCnt; i++)
@ -48,7 +47,7 @@ namespace general{
} }
} }
Task *CThreadPool::PopTask(){ Task *CThreadPool::PopTask() {
std::unique_lock<std::mutex> lk(this->mMutex); std::unique_lock<std::mutex> lk(this->mMutex);
while (mTasks.empty() && mStarted) while (mTasks.empty() && mStarted)
{ {
@ -62,8 +61,7 @@ namespace general{
return ret; return ret;
} }
void CThreadPool::Process(int id) void CThreadPool::Process(int id) {
{
// std::cout << "thread id " << id << " started " << std::endl; // std::cout << "thread id " << id << " started " << std::endl;
while (mStarted) while (mStarted)
{ {
@ -75,12 +73,12 @@ namespace general{
else else
{ {
task->Run(); task->Run();
task->OnDone();
} }
} }
} }
void CThreadPool::Stop() void CThreadPool::Stop() {
{
{ {
std::lock_guard<std::mutex> lk(mMutex); std::lock_guard<std::mutex> lk(mMutex);
mStarted = false; mStarted = false;
@ -93,8 +91,7 @@ namespace general{
} }
mStarted = false; mStarted = false;
} }
void CThreadPool::StopAll() void CThreadPool::StopAll() {
{
{ {
while(this->mTasks.size() > 0) while(this->mTasks.size() > 0)
std::this_thread::sleep_for(std::chrono::milliseconds(100)); std::this_thread::sleep_for(std::chrono::milliseconds(100));

View File

@ -1,3 +1,11 @@
/*
* @Author: your name
* @Date: 2021-10-09 10:03:45
* @LastEditTime: 2021-11-25 15:26:02
* @LastEditors: Please set LastEditors
* @Description: koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
* @FilePath: \cpp11\threadpool.h
*/
#pragma once #pragma once
#include <thread> #include <thread>
#include <mutex> #include <mutex>
@ -22,13 +30,13 @@ extern "C"{
} }
namespace general{ namespace general{
class CThreadPool; class CThreadPool;
enum PRIORITY enum PRIORITY {
{
MIN = 1, NORMAL = 25, MAX = 50 MIN = 1, NORMAL = 25, MAX = 50
}; };
typedef class CTask{
class Task{
public: public:
CTask() { Task() {
} }
void SetPriority(int priority) { void SetPriority(int priority) {
if (priority>(PRIORITY::MAX)) if (priority>(PRIORITY::MAX))
@ -39,11 +47,12 @@ namespace general{
{ {
priority = (PRIORITY::MIN); priority = (PRIORITY::MIN);
} }
} }
virtual void Run() = 0; virtual void Run() = 0;
virtual void OnDone() = 0;
protected: protected:
int priority_; int priority_;
}Task; };
class Worker{ class Worker{
public: public:
@ -82,4 +91,5 @@ namespace general{
std::mutex mMutex; std::mutex mMutex;
std::condition_variable mQueueAvaliableCondition; std::condition_variable mQueueAvaliableCondition;
}ThreadPool; }ThreadPool;
} }