tin 项目是完整实现的 C++ 版 go 语言运行时。它参考 go 语言运行时,将 go 语言运行时用 C++ 重写了一遍, 让你可以在 C++ 中使用 go 的风格写程序。
平台
Windows XP or later
OS X 10.8 or later
Linux 2.6.23 or later
构建
git clone --recursive https://github.com/cloudpeak/tin.git
mkdir build
cd build
Visual Studio 2015 Win64
cmake -G "Visual Studio 14 2015 Win64" ../tin -DCMAKE_BUILD_TYPE=RELEASE
Visual Studio 2015 Win32
cmake -G "Visual Studio 14 2015" ../tin -DCMAKE_BUILD_TYPE=RELEASE
Visual Studio 2008 Win32
cmake -G "Visual Studio 9 2008" ../tin -DCMAKE_BUILD_TYPE=RELEASE
GCC or Clang
cmake ../tin -DCMAKE_BUILD_TYPE=RELEASE && make
示例
#include "tin/all.h" void HandleClient(tin::net::TcpConn conn) { // Set TCP Read Write buffer. conn->SetReadBuffer(64 * 1024); conn->SetWriteBuffer(64 * 1024); // user space buffer size. const int kIOBufferSize = 4 * 1024; scoped_ptr<char[]> buf(new char[kIOBufferSize]); // set read, write deadline. const int64 kRWDeadline = 20 * tin::kSecond; conn->SetDeadline(kRWDeadline); while (true) { int n = conn->Read(buf.get(), kIOBufferSize); int err = tin::GetErrorCode(); if (n > 0) { conn->SetReadDeadline(kRWDeadline); } if (err != 0) { VLOG(1) << "Read failed due to: " << tin::GetErrorStr(); // FIN received, graceful close, we can still send. if (err == TIN_EOF) { if (n > 0) { conn->Write(buf.get(), n); } conn->CloseWrite(); // delay a while to avoid RST. tin::NanoSleep(500 * tin::kMillisecond); } break; } DCHECK_GT(n, 0); conn->Write(buf.get(), n); if (tin::GetErrorCode() != 0) { VLOG(1) << "Write failed due to " << tin::GetErrorStr(); break; } conn->SetWriteDeadline(kRWDeadline); } conn->Close(); } int TinMain(int argc, char** argv) { const uint16 kPort = 2222; bool use_ipv6 = false; tin::net::TCPListener listener = tin::net::ListenTcp(use_ipv6 ? "0:0:0:0:0:0:0:0" : "0.0.0.0", kPort); if (tin::GetErrorCode() != 0) { LOG(FATAL) << "Listen failed due to " << tin::GetErrorStr(); } LOG(INFO) << "echo server is listening on port: " << kPort; while (true) { tin::net::TcpConn conn = listener->Accept(); if (tin::GetErrorCode() == 0) { tin::Spawn(&HandleClient, conn); } else { LOG(INFO) << "Accept failed due to " << tin::GetErrorStr(); } } return 0; } int main(int argc, char** argv) { tin::Initialize(); // set logging level. logging::SetMinLogLevel(logging::LOG_INFO); // set max p count. tin::Config config = tin::DefaultConfig(); config.SetMaxProcs(base::SysInfo::NumberOfProcessors()); // start the world. tin::PowerOn(TinMain, argc, argv, &config); // wait for power off tin::WaitForPowerOff(); // cleanup. tin::Deinitialize(); return 0; }
在 Go语言程序运行时(runtime)实现了一个小型的任务调度器。这套调度器的工作原理类似于操作系统调度线程,Go 程序调度器可以高效地将 CPU 资源分配给每一个任务。传统逻辑中,开发者需要维护线程池中线程与 CPU 核心数量的对应关系。同样的,Go 地中也可以通过 runtime.GOMAXPROCS() 函数做到,格式为: runtime.GOMAXPROCS(逻辑CPU数量) 这里的逻辑
本文向大家介绍go语言channel实现多核并行化运行的方法,包括了go语言channel实现多核并行化运行的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了go语言channel实现多核并行化运行的方法。分享给大家供大家参考。具体如下: 这里定义一个Add函数,用于返回两个整数的和,使用go 语句进行并行化运算,为了等待各个并行运算结束获得其返回值,需要引入channel 最后输出:
本文向大家介绍基于C语言实现的贪吃蛇游戏完整实例代码,包括了基于C语言实现的贪吃蛇游戏完整实例代码的使用技巧和注意事项,需要的朋友参考一下 本文以实例的形式讲述了基于C语言实现的贪吃蛇游戏代码,这是一个比较常见的游戏,代码备有比较详细的注释,对于读者理解有一定的帮助。 贪吃蛇完整实现代码如下:
本文向大家介绍基于C语言实现五子棋游戏完整实例代码,包括了基于C语言实现五子棋游戏完整实例代码的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了基于C语言实现五子棋游戏的方法,代码备有比较完整的注释,可以帮助读者更好的加以理解。 五子棋游戏代码如下:
本文向大家介绍go语言版的ip2long函数实例,包括了go语言版的ip2long函数实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了go语言版的ip2long函数。分享给大家供大家参考。具体分析如下: 这里介绍的go语言版的ip2long 函数不会对 IP 的合法性进行校验。 希望本文所述对大家的Go语言程序设计有所帮助。
本文向大家介绍C语言构建动态数组完整实例,包括了C语言构建动态数组完整实例的使用技巧和注意事项,需要的朋友参考一下 本文以一个完整的实例代码简述了C语言构建动态数组的方法,供大家参考,完整实例如下: 运行结果如下: