小编dav*_*mas的帖子

为什么这些Haskell函数的推断类型都不一样?

我定义了五个函数,在我看来它们应该是等价的(因此,它们具有相同的类型).但推断的类型是不同的.我在type-in​​ference.hs中放了以下五行:

f1 a b = a + b
f2 a = \b -> a + b
f3 = \a -> \b -> a + b
f4 a = (a+)
f5 = (+)
Run Code Online (Sandbox Code Playgroud)

然后我加载拥抱:

Hugs> :load type-inference.hs
Main> :type f1
f1 :: Num a => a -> a -> a
Main> :type f2
f2 :: Num a => a -> a -> a
Main> :type f3
f3 :: Integer -> Integer -> Integer
Main> :type f4
f4 :: Num a => …
Run Code Online (Sandbox Code Playgroud)

haskell type-inference hugs

7
推荐指数
1
解决办法
110
查看次数

当协同程序切换线程时,如何在Linux上强制g ++更新线程指针(用于TLS)?

我在C++中使用协同程序的自定义实现(编译器g ++,在ARM上).协程可以通过调用move_to_thread函数(或其他方式,从一个线程迁移到另一个线程,但这将让我说明我的观点).我过于简单了,但有点像这样:

__thread int x = 0;

void f() {
    x = 5;
    // do some more work on current thread (thread 1, say)
    move_to_thread(2);
    // do more work, now on thread 2
    int y = x; // with optimization, I'm getting the wrong x
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是调用move_to_thread之前和之后完成的工作使用线程局部变量(使用__thread).在使用优化进行编译时,在线程2上运行的代码仍然访问线程1的线程局部变量而不是它自己的变量.这是因为对线程局部变量的访问执行以下操作:

  1. 查找当前线程的TLS线程指针
  2. 将x的TLS偏移量添加到线程指针
  3. 将此地址的内存用作x

但是,在启用优化的情况下,(1)和(2)正在针对第二次访问进行优化,因为编译器假定在特定线程上开始运行的函数将保留在该线程上.我的代码不适用这种假设.

如何在调用move_to_thread之前和之后让编译器查看正确的线程本地存储,而不完全取消优化?

c++ multithreading thread-local-storage

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