小编Ear*_*ine的帖子

在linux下的GCC中使用std :: thread的正确链接选项是什么?

嗨,我正在尝试使用std::threadG ++.这是我的测试代码

#include <thread>
#include <iostream>

int main(int, char **){
    std::thread tt([](){ std::cout<<"Thread!"<<std::endl; });
    tt.join();
}
Run Code Online (Sandbox Code Playgroud)

它编译,但当我尝试运行它时,结果是:

terminate called after throwing an instance of 'std::system_error'
  what():  Operation not permitted 
Aborted
Run Code Online (Sandbox Code Playgroud)

我的编译器版本:

$ g++ --version
g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Run Code Online (Sandbox Code Playgroud)

我的测试代码出了什么问题?

更新:我使用以下命令行来编译和运行我的代码.

$ g++ -std=c++0x test.cpp
$ ./a.out
Run Code Online (Sandbox Code Playgroud)

我试过 …

c++ multithreading g++ c++11

87
推荐指数
3
解决办法
5万
查看次数

使用MonadRef实现MonadCont

有一个众所周知的问题是我们不能forallCont返回类型中使用类型.

但是,可以使用以下定义:

class Monad m => MonadCont' m where
    callCC' :: ((a -> forall b. m b) -> m a) -> m a
    shift :: (forall r.(a -> m r) -> m r) -> m a
    reset :: m a -> m a
Run Code Online (Sandbox Code Playgroud)

然后找一个有意义的实例.在本文中,作者声称我们可以MonadFixContT r m提供m实现MonadFix和实现之上实现MonadRef.但我想如果我们确实有一个,MonadRef我们可以实际上实现callCC'如下:

--satisfy law: mzero >>= f === mzero
class Monad m => MonadZero …
Run Code Online (Sandbox Code Playgroud)

continuations haskell delimited-continuations

63
推荐指数
1
解决办法
555
查看次数

Java如何通过原始类型作为参数的反射来调用方法

我在类中有以下两种方法:

public void Test(int i){
    System.out.println("1");
}
public void Test(Integer i){
    System.out.println("2");
}
Run Code Online (Sandbox Code Playgroud)

以下代码行

this.getClass().getMethod("Test",Integer.class).invoke(this, 10);
Run Code Online (Sandbox Code Playgroud)

打印2,如何打印1

java reflection

56
推荐指数
2
解决办法
3万
查看次数

如何将unique_ptr捕获到lambda表达式中?

我尝试过以下方法:

std::function<void ()> getAction(std::unique_ptr<MyClass> &&psomething){
    //The caller given ownership of psomething
    return [psomething](){ 
        psomething->do_some_thing();
        //psomething is expected to be released after this point
    };
}
Run Code Online (Sandbox Code Playgroud)

但它没有编译.有任何想法吗?

更新:

AS建议,需要一些新的语法来明确指定我们需要将所有权转移到lambda,我现在考虑以下语法:

std::function<void ()> getAction(std::unique_ptr<MyClass> psomething){
    //The caller given ownership of psomething
    return [auto psomething=move(psomething)](){ 
        psomething->do_some_thing();
        //psomething is expected to be released after this point
    };
}
Run Code Online (Sandbox Code Playgroud)

它会是一个好的候选人吗?

更新1:

我将展示我的实施movecopy如下:

template<typename T>
T copy(const T &t) {
    return t;
}

//process lvalue references
template<typename T>
T move(T &t) {
    return …
Run Code Online (Sandbox Code Playgroud)

c++ lambda unique-ptr c++11

38
推荐指数
4
解决办法
3万
查看次数

Haskell适合量子计算吗?

我刚读了一篇关于量子物理学的文章.一个有趣的事情是,在Haskell程序员看来,这两个领域之间存在一些相似之处.

首先,量子世界中的测量看起来类似于Haskell中的懒惰评估:如果你不测量,你不知道猫是生还是死.如果您不评估,则不知道该值是否已定义或undefined.

其次,在量子中我们有EPR悖论,这可以通过高于光的速度或等效的时间机器的相互作用来解释.在Haskell,正如我们在看到大会:递归循环编程做-Monad.Reader问题6,我们可以访问,通过使用递归的来自未来的值do.

最后,在量子中,我们必须区分熵永不减少的可观察世界和时间在两个方向上相等的"纯"量子世界.在Haskell中,我们拥有IO()描述程序实际执行情况的世界,以及从未产生副作用的纯粹功能世界,并且价值从不依赖于评估顺序.

所以我猜上述事实表明这两个领域之间存在一些相互联系.这会产生更有趣的后果吗?例如,虽然我已经谈到了EPR悖论,但我不知道如何创建一个Haskell程序来模拟这个:一个函数创建两个值,后来对其中一个的评估会影响另一个(我认为这些值必须有IO()类型,但我不知道如何把它们放在一起).

haskell quantum-computing

22
推荐指数
1
解决办法
3179
查看次数

是否有一种称为"半单子"或"反单子"的东西?

好吧,我正在研究Haskell Monads.当我阅读Wikibook 类别理论文章时,我发现monad态射的签名看起来很像逻辑中的重言式,但你需要转换M a~~A,这里~是逻辑否定.

return :: a -> M a -- Map to tautology A => ~~A, double negation introduction
(>>=) :: M a -> (a -> M b) -> M b -- Map to tautology ~~A => (A => ~~B) => ~~B
Run Code Online (Sandbox Code Playgroud)

其他业务也是重言式:

fmap :: (a -> b) -> M a -> M b -- Map to (A => B) -> (~~A => ~~B)
join :: M (M a) -> M a …
Run Code Online (Sandbox Code Playgroud)

monads haskell category-theory

20
推荐指数
2
解决办法
813
查看次数

"Eta reduce"并不总是在Haskell中持有?

我发现我可以说

{-# LANGUAGE RankNTypes #-}
f1 :: (forall b.b -> b) -> (forall c.c -> c)
f1 f = id f
Run Code Online (Sandbox Code Playgroud)

(和HLint告诉我,我可以在这里做"Eta减少"),但是

f2 :: (forall b.b -> b) -> (forall c.c -> c)
f2 = id
Run Code Online (Sandbox Code Playgroud)

无法编译:

Couldn't match expected type `c -> c'
            with actual type `forall b. b -> b'
Expected type: (forall b. b -> b) -> c -> c
  Actual type: (forall b. b -> b) -> forall b. b -> b
In the expression: id …
Run Code Online (Sandbox Code Playgroud)

haskell higher-rank-types

15
推荐指数
1
解决办法
761
查看次数

此错误消息是否意味着我可以在for循环中使用模式匹配?

我不希望以下代码工作,但作为语法探索的一部分,我在操场上尝试:

fn main() {
    struct EOF {};
    let lines = vec![Ok("line 1"), Ok("line 2"), Err(EOF {})];
    for Ok(line) in lines {
        println!("{}", line);
    }
}
Run Code Online (Sandbox Code Playgroud)

错误消息是

error[E0005]: refutable pattern in `for` loop binding: `Err(_)` not covered
 --> src/main.rs:4:9
  |
4 |     for Ok(line) in lines {
  |         ^^^^^^^^ pattern `Err(_)` not covered
Run Code Online (Sandbox Code Playgroud)

根据上面的消息,看起来我只需要为Err案例添加一个匹配臂.但这样做的正确语法是什么?

rust

14
推荐指数
2
解决办法
1174
查看次数

锁定shared_ptr

我有一个共享对象需要发送到系统API并稍后将其解压缩.系统API仅接收void*.我不能使用shared_ptr :: get(),因为它不会增加引用计数,并且可以在从系统API中提取之前由其他线程释放.发送新的shared_ptr*将起作用,但涉及额外的堆分配.

一种方法是让对象派生自enable_shared_from_this.但是,因为此类模板仅拥有weak_ptr,所以仅保持释放对象是不够的.

所以我的解决方案如下所示:

class MyClass:public enable_shared_from_this<MyClass> {
private:
    shared_ptr<MyClass> m_this;
public:
    void *lock(){
        m_this=shared_from_this();
        return this;
    }
    static shared_ptr<MyClass> unlock(void *p){
        auto pthis = static_cast<MyClass *>(p);
        return move(pthis->m_this);
    }
/* ... */
}

/* ... */
autp pobj = make_shared<MyObject>(...);
/* ... */
system_api_send_obj(pobj->lock());
/* ... */
auto punlocked = MyClass::unlock(system_api_reveive_obj());
Run Code Online (Sandbox Code Playgroud)

有没有更简单的方法来做到这一点?

这个解决方案的缺点:

  • 除了基类中shared_ptr<MyClass>的a 之外,它还需要在MyClass对象布局中添加一个.weak_ptrenable_shared_from_this

  • 正如我在评论中提到的,访问lock()unlock()同时不安全.

  • 最糟糕的是,这个解决方案只能lock()在呼叫之前支持一次unlock().如果要将同一对象用于多个系统API调用,则必须实现其他引用计数.

如果我们有另一个enable_lockable_shared_from_this类,那将是更大的:

class MyClass:public enable_lockable_shared_from_this<MyClass> {
/* ... …
Run Code Online (Sandbox Code Playgroud)

c++ shared-ptr c++11

11
推荐指数
1
解决办法
5001
查看次数

为什么“第一个”或“任意”聚合函数在数据库引擎中不常用?

某些数据库引擎(例如 Microsoft Access)支持FIRST()聚合函数,我在知道该列在组中只有一个值的情况下使用它。

数据库引擎可能可以对此进行优化,就好像它达到任何值一样,它可以将该值标记为已计算。因此,令人惊讶的是为什么 Oracle 或 SQL Server 等中不支持这一点,更重要的是,SQL 标准也不支持这一点。

实际中,人们用MIN()orMAX()代替,但都要求

  1. 下面的数据类型具有自然的排序语义,并且排序对用户来说很重要;

  2. 数据库引擎必须将中间值与每行中的值进行比较

所以在很多情况下这并不是最优的。

人们有什么不想允许的具体原因吗SELECT ANY(FIELD) ...?(我可以想到两种变体:ANY()给出结果集中该列不为空的任何值;FIRST()给出结果集中第一行的列值,如果没有行则给出 null)

sql database

10
推荐指数
1
解决办法
9299
查看次数