- 授权协议: GPL
- 开发语言: C/C++
- 操作系统: 跨平台
- 软件首页: https://gitee.com/mycloudpeak/tin
- 软件文档: https://gitee.com/mycloudpeak/tin
软件介绍
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;
}
硅谷增长黑客实战笔记
曲卉 / 机械工业出版社 / 2018-4-10 / 65.00元
增长黑客这个词源于硅谷,简单说,这是一群以数据驱动营销、以迭代验证策略,通过技术手段实现爆发式增长的新型人才。近年来,互联网公司意识到这一角色可以发挥四两拨千斤的作用,因此对该职位的需求也如井喷式增长。 本书作者曾在增长黑客之父肖恩•埃利斯麾下担任增长负责人,用亲身经历为你总结出增长黑客必备的套路、内力和兵法。本书不仅有逻辑清晰的理论体系、干货满满的实践心得,还有Pinterest、SoFi......一起来看看 《硅谷增长黑客实战笔记》 这本书的介绍吧!
