我正在尝试使用Haskell开发聊天服务器.
有很多像有用的工具TChan,TSkiplist,forkIO...等等,但事实证明,我的大部分代码是IO单子和unsafePerformIO,这听起来非常低效里面写.
这样做是否可以,或者haskell不是用于此目的的正确工具?
如何为socket设置接收超时,我在socket选项man中找不到它.
我对问题的第一个解决方案就是把声明放在后面.
{ok, Listen} = gen_tcp:listen(Port, [..,{active, once}...]),
{ok, Socket} = gen_tcp:accept(Listen),
loop(Socket).
loop(Socket) ->
receive
{tcp, Socket, Data} ->
inet:setopts(Sock, [{active, once}]),
loop(Socket);
{tcp_closed, Socket} -> closed;
Other -> process_data(Other)
after 1000 -> time_out
end.
Run Code Online (Sandbox Code Playgroud)
但是套接字可能永远不会超时,因为有来自其他进程的消息如何设置超时而不产生其他进程?
什么是prim_inet模块,它是如何工作的?
我试图谷歌它但我没有找到任何有用的文档.
我查看了源文件prim_inet.erl,但没有什么特别的,剂量prim_inet:async_recv为每个recv生成一个新进程?
可能重复:
使用GreaterThan或LessThan而不是相等的Interlocked.CompareExchange <Int>
我知道Interlocked.CompareExchange仅在值和comparand相等时交换值,
如果不等于实现这样的话,如何交换它们?
if (Interlocked.CompareExchange(ref count, count + 1, max) != max)
// i want it to increment as long as it is not equal to max
{
//count should equal to count + 1
}
Run Code Online (Sandbox Code Playgroud)