小编art*_*tem的帖子

pthread_cond_timedwait不会在GHC FFI中返回

我试图实现Control.Concurrent.MVar驻留在共享内存中的Haskell ,并允许使用POSIX功能在多个独立进程/程序之间进行通信.但是我失败了很多僵局.

问题是pthread_cond_timedwait有时候不会在GHC FFI中调用(尽管interruptible或是unsafe).经过几天绝望的尝试解决问题后,我决定缩小代码并要求社区提供帮助.不幸的是,我无法将问题浓缩成几行代码.因此,我在github上存储了(尽可能小的)代码以及如何复制问题的指令,这是它的当前状态(mvar-fail分支)的永久链接.

从本质上讲,采取和放置mvar的函数如下所示:

int mvar_take(MVar *mvar, ...) {
   pthread_mutex_timedlock(&(mvar->statePtr->mvMut), &timeToWait);
   while ( !(mvar->statePtr->isFull) ) {
     pthread_cond_signal(&(mvar->statePtr->canPutC));
     pthread_cond_timedwait(&(mvar->statePtr->canTakeC), &(mvar->statePtr->mvMut), &timeToWait);
   }
   memcpy(localDataPtr, mvar->dataPtr, mvar->statePtr->dataSize);
   mvar->statePtr->isFull = 0;
   pthread_mutex_unlock(&(mvar->statePtr->mvMut));
}

int mvar_put(MVar *mvar, ...) {
   pthread_mutex_timedlock(&(mvar->statePtr->mvMut), &timeToWait);
   while ( mvar->statePtr->isFull ) {
     pthread_cond_signal(&(mvar->statePtr->canTakeC));
     pthread_cond_timedwait(&(mvar->statePtr->canPutC), &(mvar->statePtr->mvMut), &timeToWait);
   }
   memcpy(mvar->dataPtr, localDataPtr, mvar->statePtr->dataSize);
   mvar->statePtr->isFull = 1;
   pthread_mutex_unlock(&(mvar->statePtr->mvMut));
}
Run Code Online (Sandbox Code Playgroud)

(加上每个命令后的错误检查和printfs). 完整代码mvar_take. 初始化发生如下:

pthread_mutexattr_init(&(s.mvMAttr));
pthread_mutexattr_settype(&(s.mvMAttr), PTHREAD_MUTEX_ERRORCHECK);
pthread_mutexattr_setpshared(&(s.mvMAttr), PTHREAD_PROCESS_SHARED);
pthread_mutex_init(&(s.mvMut), …
Run Code Online (Sandbox Code Playgroud)

c haskell posix mutex ghc

8
推荐指数
1
解决办法
313
查看次数

HTF不测试TH生成的道具

我想在我的库中对各种类型进行一些类似的测试.

为简化起见,假设我有许多实现Num类的向量类型,并且我想生成相同的QuickCheck属性检查prop_absNorm x y = abs x + abs y >= abs (x+y),该检查可以对库中的所有类型起作用.

我使用TH生成这样的属性:

$(writeTests
    (\t ->
        [d| prop_absNorm :: $(t) -> $(t) -> Bool
            prop_absNorm x y = abs x + abs y >= abs (x+y)
        |])
 )
Run Code Online (Sandbox Code Playgroud)

我生成测试的函数具有以下签名:

writeTests :: (TypeQ -> Q [Dec]) -> Q [Dec]
Run Code Online (Sandbox Code Playgroud)

此函数查找我的矢量类的所有实例VectorMath (n::Nat) t(以及同时的实例Num)reify ''VectorMath并相应地生成所有prop函数. -ddump-splices显示这样的事情:

prop_absNormIntX4 :: Vector 4 Int -> Vector 4 Int -> Bool
prop_absNormIntX4 x y = …
Run Code Online (Sandbox Code Playgroud)

haskell quickcheck template-haskell htf

5
推荐指数
1
解决办法
135
查看次数

标签 统计

haskell ×2

c ×1

ghc ×1

htf ×1

mutex ×1

posix ×1

quickcheck ×1

template-haskell ×1