你有两个线程,a和b.线程a处于永久循环中,侦听阻塞套接字1.线程b也处于永久循环中,侦听阻塞套接字2.套接字1和套接字2都可以在任意时间返回数据,因此线程a可能永远在睡觉等待数据,而线程b不断从套接字获取数据并继续处理.这就是背景.
现在假设他们需要共享字典.当线程a获取一些数据(如果有的话)时,它会在一些处理之后将一个键值对添加到字典中,然后继续等待更多数据.当线程b从其套接字接收数据时,它首先查询字典,以查看在继续处理之前是否存在与其已接收的数据相关的信息.字典没有删除,只有插入和查询(如果这在最终解决方案中有所不同,我会感兴趣).
在像python或c这样的标准命令式语言中,通过使字典在两个作用域中都可用并且仅在线程获得锁定后查询它,这很容易做到,因此线程B总是看到最多(几乎是)最新的字典.
在Haskell中,我似乎正在努力想出这个模式的良好实现.MVars,一次只能有一个项目因此不能将一个项目放入字典中,因为可能会发生新的更新,并且在线程b从MVar中获取它之前它将无法推送新的字典.另一方面,如果线程b使用MVar发送就绪信号"ok!" 线程a,可能是Thread a在其读取套接字上休眠的情况,因此在读取套接字解除阻塞之前它将无法发回数据!还有频道,但这似乎很混乱,因为我不得不继续发送新词典,而线程B将丢弃除最后一个之外的所有字典.
可行的替代解决方案是简单地沿着通道发送更新,并让线程B为自己构建字典.但是我想知道是否有更好的替代解决方案.
感谢您花时间阅读这个很长的问题!
我正在查看Cloud Haskell软件包的Encoding.hs,并遇到了一些奇怪的代码,我希望有人可以帮助我更好地理解.包括必要的代码:
class (Binary a,Typeable a) => Serializable a
instance (Binary a,Typeable a) => Serializable a
data Payload = Payload
{
payloadType :: !ByteString,
payloadContent :: !ByteString
} deriving (Typeable)
serialDecodePure :: (Serializable a) => Payload -> Maybe a
serialDecodePure a = (\id ->
let pc = payloadContent a
in pc `seq`
if (decode $! payloadType a) == show (typeOf $ id undefined)
then Just (id $! decode pc)
else Nothing ) id
Run Code Online (Sandbox Code Playgroud)
我只是好奇什么是$!(我猜测只是严格评估),还有为什么我们需要id技巧(懒惰评估的东西?).另外我特意遇到这条线的问题:
if (decode $! payloadType …Run Code Online (Sandbox Code Playgroud) 我需要编写一个算法,在HMM中找到top-k维特比路径(使用常规维特比算法找到最佳路径).
我想我可能需要为每个状态N保存一个大小为k的列表V_t,N,其中包含以状态N结尾的前K路径,但我不太确定如何跟踪该列表..任何想法?谢谢
维基百科提到"bss部分通常包括在文件范围内声明的所有未初始化的变量." 给出以下文件:
int uninit;
int main() {
uninit = 1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我将其编译为可执行文件时,我看到正确填充了bss段:
$ gcc prog1.c -o prog1
$ size prog1
text data bss dec hex filename
1115 552 8 1675 68b prog1
Run Code Online (Sandbox Code Playgroud)
但是,如果我将其编译为目标文件,我看不到bss段(我希望它是4):
$ gcc -c prog1.c
$ size prog1.o
text data bss dec hex filename
72 0 0 72 48 prog1.o
Run Code Online (Sandbox Code Playgroud)
有什么明显的东西我不见了吗?
我使用的是gcc版本4.8.1.
我的问题是如何编写友好的Haskell接口来模拟可以从C代码调用的回调.这里回答了回调(HaskellWiki),但是,我认为这个问题比该链接的例子更复杂.
假设我们有C代码,需要回调,标题如下所示:
typedef int CallbackType(char* input, char* output, int outputMaxSize, void* userData)
int execution(CallbackType* caller);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,该函数execution采用一个回调函数,并将使用它来处理新数据,本质上是一个闭包.回调需要一个输入字符串,一个已经分配了大小的输出缓冲区outputMaxSize和userData指针,但是这些指针可以在回调中输入.
我们在haskell中做类似的事情,当我们使用MVars传递闭包时,我们仍然可以进行通信.因此,当我们编写外部接口时,我们希望保留这种类型.
具体来说,FFI代码可能是这样的:
type Callback = CString -> CString -> CInt -> Ptr () -> IO CInt
foreign import ccall safe "wrapper"
wrap_callBack :: Callback -> IO (FunPtr Callback)
foreign import ccall safe "execution"
execute :: FunPtr Callback -> IO CInt
Run Code Online (Sandbox Code Playgroud)
用户应该可以做这种事情,但感觉就像一个糟糕的接口,因为他们需要编写类型为Ptr()的回调.相反,我们想用感觉更自然的MVars来代替它.所以我们想写一个函数:
myCallback :: String -> Int -> MVar a -> (Int, String)
myCallback input maxOutLength data …Run Code Online (Sandbox Code Playgroud) 程序可以在运行时进行监控(可能需要管道事件日志)吗?或者只能在执行后查看事件日志.如果是后者,那么Haskell运行时的工作方式是否有更深层次的原因?
编辑:我对运行时tbh知之甚少,但考虑到dflemstr的响应,我很好奇通过添加事件监视运行时选项可以减少性能和降低性能的方式.我记得在RWH他们提到rts必须增加成本中心,但我并不完全确定这种东西有多贵.
问题:是否有任何方法可以记录或确定提供给客户端的应用程序中发生死锁的位置(可能通过在构建过程中启用某些标志)?
背景:通常当我测试代码并发生死锁时,我在Visual Studio中运行,所以我可以点击全部调试并找到正在等待的线程以及在哪里,我立即知道问题是什么.但是,有一个问题导致我的应用程序很少冻结(在单元或集成测试中未检测到).这发生在客户端机器上,他只运行可执行二进制文件.我很想知道是否有任何我可以启用的功能可以帮助报告这些问题,因为很难说没有调试器就可能出现问题.
我需要在Tradestation的EasyLanguage到C++之间构建一个"翻译器"(交叉编译器是正确的词吗?).但是,没有关于EasyLanguage语法的完整文档(我可以找到).
作为一个更普遍的问题,如果我们知道(或者即使我们不知道)存在某些基本标记,如果在一些语言"A"中有一组有效的程序,是否可以辨别出"A"的语法?比如'if''other'和保留字,或者这是那些未解决的案例特定(难?)问题.
我可以使用任何有用的工具来开始吗?
我是C#的新手,我很难搞清楚测试组件的工作原理.这是我的Solution目录(里面有一个项目MyProject):
MySolution/MySolutionFile.sln -- My Solution File
MySolution/packages -- My Packages Directory
MySolution/MyProject/Properties -- My Project Properties
MySolution/MyProject/src -- My Source Code
/src/MyClass1.cs
/src/MyClass2.cs
MySolution/MyProject/test -- My NUnit Tests
/test/MyClass1Test.cs
/test/MyClass2Test.cs
MySolution/MyProject/TheMainClass.cs
Run Code Online (Sandbox Code Playgroud)
现在我可以在visual studio的测试文件夹中运行所有测试.但是我想从像TeamCity这样的CI系统运行测试,在这种情况下我需要一个汇编路径.如何仅将测试文件夹生成到要运行的程序集中.
我是否需要在主类中添加一个在MySolution/test文件夹中运行每个测试的方法?