no message
parent
88ce90857a
commit
9a96adcd07
|
@ -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")
|
||||||
|
|
||||||
|
|
|
@ -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";
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
|
@ -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));
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue