Chinaunix

标题: [C++] C++er看到这么漂亮的js代码,自杀的心都有了(分享不是自己写的一些代码) [打印本页]

作者: 群雄逐鹿中原    时间: 2011-11-16 14:58
标题: [C++] C++er看到这么漂亮的js代码,自杀的心都有了(分享不是自己写的一些代码)

  1. var http = require('http');
  2. http.createServer(function (req, res) {
  3.   res.writeHead(200, {'Content-Type': 'text/plain'});
  4.   res.end('Hello World\n');
  5. }).listen(1337, "127.0.0.1");
  6. console.log('Server running at http://127.0.0.1:1337/');
复制代码

作者: egametang    时间: 2011-11-16 15:00
群雄逐鹿中原 发表于 2011-11-16 14:58



    操,直接用的C++ v8引擎,还好意思说……
作者: 群雄逐鹿中原    时间: 2011-11-16 15:01
操,直接用的C++ v8引擎,还好意思说……
egametang 发表于 2011-11-16 15:00



    第一个C++编译器还不是用C写的,还好意思说
作者: egametang    时间: 2011-11-16 15:03
第一个C++编译器还不是用C写的,还好意思说
群雄逐鹿中原 发表于 2011-11-16 15:01



    现在不是了哦 js也自己编译解析自己试试
作者: egametang    时间: 2011-11-16 15:06
差点上你当了,请Cer正面回答,Cer挑衅C++,别拿js来说事
作者: 群雄逐鹿中原    时间: 2011-11-16 15:19
别啦,上面都是开玩笑。

因为每次写多线程的交互代码,最后都陷入万劫不复的混乱中,
这两天在琢磨这段代码,如何用C/C++的等价表达?

利用 回调函数(或仿函数/lambda表达式) 等手段,
不难模拟出类似表达。
难琢磨的地方:
线程(或进程)之间消息传递,如何包装,使他像node.js一样,对用户几乎看不到。


这个回调函数,看似要在主线程的空间内执行比较好。
不晓得写C/C++的,有什么好的模型。



//主线程
var http = require('http');

//主线程:创建一个子线程
http.createServer(
  function (req, res) {
    //子线程:执行,给主线程发送创建完毕的消息

    //主线程:给子线程发送writeHead消息,控制子线程执行writeHead函数
    res.writeHead(200, {'Content-Type': 'text/plain'});

    //主线程:给子线程发送end消息,控制子线程执行end函数
    res.end('Hello World\n');

}).listen(1337, "127.0.0.1");

console.log('Server running at http://127.0.0.1:1337/');

//主线程:等待所有子线程完成
作者: 幻の上帝    时间: 2011-11-16 15:22
回复 5# egametang


    这是C的原罪,Cer也跑不了。
作者: egametang    时间: 2011-11-16 15:22
本帖最后由 egametang 于 2011-11-16 15:23 编辑
别啦,上面都是开玩笑。

因为每次写多线程的交互代码,最后都陷入万劫不复的混乱中,
这两天在琢磨这段 ...
群雄逐鹿中原 发表于 2011-11-16 15:19



    可以参考我写的ThreadPoolTest, 两个线程直接跨越是非常简单的事情
做得更好一点可以用lockfree互斥
作者: 群雄逐鹿中原    时间: 2011-11-16 15:26
可以参考我写的ThreadPoolTest, 两个线程直接跨越是非常简单的事情
做得更好一点可以用lockfree ...
egametang 发表于 2011-11-16 15:22



    请给个链接看一下,thank you

BTW, 除内核的某些极端情况下,我是从来不相信lock free的,lock free好比拿忙等换lock,呵呵
作者: egametang    时间: 2011-11-16 15:29
请给个链接看一下,thank you

BTW, 除内核的某些极端情况下,我是从来不相信lock free的,l ...
群雄逐鹿中原 发表于 2011-11-16 15:26



    https://github.com/egametang/Ega ... d/ThreadPoolTest.cc

两个线程交互,保证操作修改一个变量始终在同一个线程就行了,如果在两个线程修改同一个变量可以把其中一个线程的修改动作调度到另外一个线程执行
lockfree在锁的颗粒度很小的情况使用是比较好的
作者: 群雄逐鹿中原    时间: 2011-11-16 15:47
两个线程交互,保证操作修改一个变量始终在同一个线程就行了,如果在两个线程修改同一个变量 ...
egametang 发表于 2011-11-16 15:29


我在想C++能不能包出类似这样的效果,
如果能,就能用类似js的形式,将大量的多线程消息传递藏起来。

除了onCallFinished这里实现的不方便外,
参数传递也是个问题。

  1. for (int i = 0; i < 100; ++i)
  2.         {
  3.                 call( ThreadPoolTest::Max, this, x[i], y[i], &z[i], onCallFinished = function()
  4.                     {
  5.                            //在主线程中执行onCallFinished的函数
  6.                            call( ThreadPoolTest::AnotherFunction, this, x[i], y[i], &z[i], onCallFinished = function()
  7.                            {
  8.                                。。。
  9.                            } );
  10.                     }
  11.                 );
  12.         }
复制代码

作者: egametang    时间: 2011-11-16 15:56
我在想C++能不能包出类似这样的效果,
如果能,就能用类似js的形式,将大量的多线程消息传递藏起来。
...
群雄逐鹿中原 发表于 2011-11-16 15:47


那需要语法的支持了,lambda就是干这种事的,不过c++没法隐藏threadpool,c#到是可以
实现你这个需求可以这样改下代码

void Max(int a, int b, int* z, boost::function<void (void)> func)
{
        *z = a > b? a : b;
        func();
}

void OnMaxFinsh() {
  cout << "finish";
}

boost::function<void (void)> callback = boost::bind(OnMaxFinsh);
pool.Schedule(boost::bind(&ThreadPoolTest::Max,
                                                this, x, y, &z,  callback));
作者: 群雄逐鹿中原    时间: 2011-11-16 16:03
那需要语法的支持了,lambda就是干这种事的,不过c++没法隐藏threadpool,c#到是可以
实现你这个需求可 ...
egametang 发表于 2011-11-16 15:56



    lambda可能是个关键,
boost的lambda本质上是生成仿函的表达式,有复杂点的句子时很难用。
作者: egametang    时间: 2011-11-16 16:11
asio库就是全异步的,自己搭配一个线程池就完全可以实现你需要的功能了

https://github.com/egametang/Ega ... er/Cpp/Platform/Rpc
就是用asio配合线程池做的




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2