标签: multiplexing

写一个列表解复用器

我正在尝试处理音频信号的通道.我得到信号作为帧的列表,其中每个帧具有每个通道的样本.现在我想独立处理流然后再合并它们.所以我想要

type Sample = Double
type Frame = [Sample]
type Stream = [Sample]
mux :: [Stream] -> [Frame]
demux :: [Frame] -> [Stream]
process :: Stream -> Stream

output = (mux . (map process) . demux) input

mux [[0.1, -0.1, -0.3], [0.2, 0.4, 0.6]] = [[0.1, 0.2], [-0.1, 0.4], [-0.3, 0.6]]
demux [[0.1, 0.2], [-0.1, 0.4], [-0.3, 0.6]] = [[0.1, -0.1, -0.3], [0.2, 0.4, 0.6]]
Run Code Online (Sandbox Code Playgroud)

因为流很长,mux而且demux必须是懒惰的而不是评估整个列表.

多路复用器似乎很简单.我唯一不喜欢这个版本的是难以阅读的模式匹配.

mux streams@((_:_):_) = map head streams : mux (map …
Run Code Online (Sandbox Code Playgroud)

haskell multiplexing data-structures

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

在辅助线程中调用select()/ pselect()会导致主线程阻塞吗?

我有一个我正在处理的应用程序需要几个辅助线程,每个应用程序都要负责一些文件句柄(至少1个,超过10个).文件句柄不在线程之间共享,因此我不必担心一个辅助线程在select查看准备读/写的内容时阻塞另一个.我想要确定的是,在执行select/ pselectcall时,两个辅助线程都不会导致主线程停止执行.

我认为这不是一个问题 - 人们可以想象这样的事情会在网络服务器上完成 - 但我找不到任何具体说"是的,你可以这样做",当我用Google搜索时.我是否认为这不会导致任何问题?

为了澄清,我看到的是:

  • 主要执行线程(select()循环处理传入命令消息和传出响应)

  • 辅助线程#1(select()提供服务的循环)

  • 辅助线程#2(select()提供另一个服务的循环)

正如我之前提到的,没有一个文件句柄在线程之间共享 - 它们是在一个单独的线程中创建,使用和销毁的,其他线程不知道它们的存在.

c io pthreads multiplexing

0
推荐指数
1
解决办法
1690
查看次数

如何在Go中复用通道输出

我正在寻找一种解决方案,可以多路传输一些通道输出。

我有一个数据源,它是从io.Reader我发送到单个通道的读取的。另一方面,我有一个从通道读取的websocket请求处理程序。现在,发生了两个客户端创建一个websocket连接的情况,这两个客户端都从同一通道读取内容,但是每个客户端仅获得部分消息。

代码示例(简体):

func (b *Bootloader) ReadLog() (<-chan []byte, error) {
    if b.logCh != nil {
        logrus.Warn("ReadLog called while channel already exists!")
        return b.logCh, nil // This is where we get problems
    }

    b.logCh = make(chan []byte, 0)

    go func() {
        buf := make([]byte, 1024)
        for {
            n, err := b.p.Read(buf)

            if err == nil {
                msg := make([]byte, n)
                copy(msg, buf[:n])
                b.logCh <- msg
            } else {
                break
            }
        }

        close(b.logCh)
        b.logCh = nil
    }()

    return b.logCh, …
Run Code Online (Sandbox Code Playgroud)

channel go multiplexing

0
推荐指数
1
解决办法
665
查看次数

这是解析函数参数的有效方法吗?

所以我是C#的新手,但是我已经想从其他更高级别的语言中得到的一件事就是能够在(接近)C中进行按位操作.我有一堆函数,其中一些或所有参数都是可选的,我喜欢开关,所以我构建了一个函数,将布尔数组转换为无符号的Shorts,这允许我基本上将一个布尔数组Mux为交换机的单个值:

namespace firstAsp.Helpers{
    public class argMux{                       
        public static ushort ba2ushort (bool[] parms){  
            //initialize position and output                
            ushort result = 0;
            int i = parms.Length-1;
            foreach (bool b in parms){
                if (b)//put a one in byte at position of b
                    //bitwise or with position
                    result |= (ushort)(1<<i);
                i--;
            }
            return result;               
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个示例用例:

public IActionResult Cheese(string fname,string lname)
    {
        bool[] tf = {fname!=null,lname!=null};

        switch(argMux.ba2ushort(tf)){
         case 3:
            @ViewData["Data"]=$"Hello, {fname} {lname}";
            break;
         case 2:
            @ViewData["Data"]=$"Hello, {fname}";
            break;
         case 1:
            @ViewData["Data"]=$"Hello, Dr. …
Run Code Online (Sandbox Code Playgroud)

c# bit-manipulation multiplexing

0
推荐指数
1
解决办法
280
查看次数

标签 统计

multiplexing ×4

bit-manipulation ×1

c ×1

c# ×1

channel ×1

data-structures ×1

go ×1

haskell ×1

io ×1

pthreads ×1