小编Mar*_*vič的帖子

一个do-block中有多个monad

我目前正在尝试学习Haskell,我真的无法理解在do-block中只使用一个monad的概念.如果我有foo :: Int -> Maybe Int并且想hIsEOF :: Handle -> IO Bool在这个函数中使用例如函数.有人可以在一些基本的例子上向我解释我将如何使用hIsEOF并可以某种方式使用Bool

我一直试图在这里和谷歌搜索,但我总是遇到一些高级的东西,基本上没有人解释如何,他们只是给出如何适应OP的代码的建议.我看到那些线程中提到的monad变换器,但即使在阅读了一些资源之后,我似乎也找不到如何使用它们的正确方法.

haskell

10
推荐指数
2
解决办法
1438
查看次数

OpenSSL 连接:警报内部错误

我在使用 SNI 的单个服务器上运行了 100 个 HTTPS 服务。(实际上,我无权访问它们。这是一个分配。我只知道它们的域名N.xxx.yy,其中 N 的范围是 00 到 99。)分配的目标是评估每个连接的安全性这些服务器。所以一些服务器包含过期的证书,带有错误 CN 的证书等。

我的问题是我无法通过某些服务器上的握手。我已经使用 OpenSSL 用 C++ 编写了自己的应用程序,但我也尝试过使用openssl s_client. 这是我连接到服务器的方式:

openssl s_client -host N.xxx.yy -port 443 -verify 1 -servername N.xxx.yy -CAfile assignment-ca.pem
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

139625941858168:error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error:s3_pkt.c:1493:SSL alert number 80
139625941858168:error:140790E5:SSL routines:ssl23_write:ssl handshake failure:s23_lib.c:177:
Run Code Online (Sandbox Code Playgroud)

在 Wireshark 中,我看到客户端发送了ClientHello,服务器响应ServerHello(选择 TLSv1.2 和ECDHE-RSA-AES256-GCM-SHA384Certificate,然后它向我Alert发送了包含Internal Error (80).

在尝试了不同的事情后,我发现如果我跑s_client-tls1或者-tls1_1我可以成功地通过握手。-tls1_2不起作用。更奇怪的是,即使协商了 TLSv1.2,通过 Chrome/Firefox/任何其他浏览器的连接也能成功。从我所见,Chrome …

ssl openssl

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

mmap:使用多线程时的性能

我有一个程序可以对大量文件(> 10 000)执行一些操作。它产生 N 个工作线程,每个线程映射一些文件,做一些工作并映射它。

我现在面临的问题是,每当我只使用 1 个进程和 N 个工作线程时,它的性能比生成 2 个进程(每个进程有 N/2 个工作线程)要差。我可以看到这一点,iotop因为 1 个进程+N 个线程仅使用大约 75% 的磁盘带宽,而 2 个进程+N/2 个线程则使用全部带宽。

一些注意事项:

  • 仅当我使用 mmap()/munmap() 时才会发生这种情况。我尝试用 fopen()/fread() 替换它,效果很好。但由于 mmap()/munmap() 附带了第 3 方库,我想以其原始形式使用它。
  • madvise() 被调用,MADV_SEQUENTIAL但如果我删除它或更改 suggest 参数,它似乎不会改变任何东西(或者只是减慢速度)。
  • 线程亲和力似乎并不重要。我试图将每个线程限制为特定的核心。我还尝试将线程限制为核心对(超线程)。到目前为止还没有结果。
  • 即使在这两种情况下,报告的负载htop似乎也是相同的。

所以我的问题是:

  • 在多线程环境中使用 mmap() 时,有什么我不知道的吗?
  • 如果是这样,为什么 2 个进程具有更好的性能?

编辑:

  • 正如评论中指出的,它在具有 2xCPU 的服务器上运行。我可能应该尝试设置线程亲和性,使其始终在同一个 CPU 上运行,但我想我已经尝试过,但它不起作用。
  • 这是一段代码,我可以用它重现与我的生产软件相同的问题。
#include <condition_variable>
#include <deque>
#include <filesystem>
#include <iostream>
#include <mutex>
#include <thread>
#include <vector>

#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>

#ifndef WORKERS …
Run Code Online (Sandbox Code Playgroud)

linux multithreading mmap

6
推荐指数
1
解决办法
3581
查看次数

Googlemock - WillOnce 中的多个操作导致构建错误

我已经使用gtest了一段时间,但最近想尝试一下gmock。我正在尝试使用返回值但也通过引用返回输出参数中的内容的方法来模拟类。这是我的小代码。

#include <vector>
#include "gmock/gmock.h"
#include "gtest/gtest.h"

using namespace ::testing;

class AReal
{
public:
    virtual bool foo(std::vector<int>& v) const = 0;
};

class AMock : public AReal
{
public:
    MOCK_CONST_METHOD1(foo, bool(std::vector<int>&));
};

class B
{
public:
    B(AReal* _a) : a(_a) {}

    bool foo(std::vector<int>& v) const { return a->foo(v); }

private:
    AReal* a;
};

class FooTest : public Test {};

TEST_F(FooTest,
DummyTestVector) {
    AMock a;
    B b(&a);

    std::vector<int> exp = { 1, 2, 3 };
    EXPECT_CALL(a, foo(_)) …
Run Code Online (Sandbox Code Playgroud)

googletest googlemock

2
推荐指数
1
解决办法
3668
查看次数

标签 统计

googlemock ×1

googletest ×1

haskell ×1

linux ×1

mmap ×1

multithreading ×1

openssl ×1

ssl ×1