C++ 引用协程
我们都知道Go的协程非常好用,那么如何在C++里面引入协程呢?
Go 导出协程函数
package main/*
#include <stdio.h>typedef void (__stdcall *PHandleRoutine)(void *params);static void ExecuteRoutine(void* handle, void *params) {PHandleRoutine pRoutine = (PHandleRoutine)handle;if (pRoutine != NULL) {pRoutine(params);}
}
*/
import "C"import ("log""unsafe"
)//export GoRoutine
func GoRoutine(handle unsafe.Pointer, params unsafe.Pointer) {go func() {if r := recover(); r != nil {log.Printf("GoRoutine failed in f %v", r)return}C.ExecuteRoutine(handle, params)}()
}func main() {}
C++ 调用携程
#pragma once
#include <string>
#include <tchar.h>
#include <windows.h>
typedef void(__stdcall* PGoRoutine)(void* handle, void* params);
class XGoRoutineTask
{
public:virtual void Execute() = 0;XGoRoutineTask() { m_bauto_free = true; }virtual ~XGoRoutineTask() {};bool IsAutoFree() { return m_bauto_free; }
protected:bool m_bauto_free;
};class XGoRoutine {
public:static XGoRoutine& Instance(){static XGoRoutine sInstance;return sInstance;}int init(const std::string& dll_path = "GoRoutine.dll"){if (m_hModule != nullptr) return true;m_hModule = ::LoadLibraryA(dll_path.c_str());if (m_hModule == nullptr)return GetLastError();m_PGoRoutine = (PGoRoutine)GetProcAddress(m_hModule,"GoRoutine");return m_PGoRoutine != nullptr;}void Go(XGoRoutineTask* pNewTask){if (m_PGoRoutine)m_PGoRoutine(&XGoRoutine::HandleRoutine, pNewTask);}
private:static void HandleRoutine(void* params){XGoRoutineTask* task = static_cast<XGoRoutineTask*>(params);if (task == nullptr) return;task->Execute();if (task->IsAutoFree()){delete task;task = nullptr;}}XGoRoutine(){m_hModule = nullptr;m_PGoRoutine = nullptr;}XGoRoutine(const XGoRoutine&) = delete;XGoRoutine(const XGoRoutine&&) = delete;
private:HMODULE m_hModule;PGoRoutine m_PGoRoutine;
};
测试
#include <iostream>
#include <windows.h>
#include <tchar.h>
#include "XGoRoutine.h"class XAddTask :public XGoRoutineTask {
public:virtual void Execute() override {printf("XAddTask[%d] excute\r\n",GetCurrentThreadId());}
};class XSubTask :public XGoRoutineTask {
public:virtual void Execute() override {printf("XSubTask[%d] excute\r\n", GetCurrentThreadId());}
};int main()
{XGoRoutine::Instance().init();while (true){XGoRoutine::Instance().Go(new XAddTask());XGoRoutine::Instance().Go(new XSubTask());Sleep(100);}std::cout << "Hello World!\n";
}