小编kas*_*eia的帖子

C++ 11中的非阻塞信号量?

本网站上的一些问题涉及C++ 11中引入的多线程支持中缺少信号量对象.许多人建议使用互斥锁或条件变量或两者的组合来实现信号量.

但是,这些方法都不允许增加和减少信号量,同时保证调用线程不被阻塞,因为通常必须在读取信号量值之前获取锁定.例如,POSIX信号量具有函数,sem_post()并且sem_trywait()两者都是非阻塞的.

是否可以仅使用C++ 11多线程支持实现非阻塞信号量?或者我是否一定要为此使用依赖于操作系统的库?如果是这样,为什么C++ 11修订版不包含信号量对象?

一个类似的问题在3年内没有得到回答.(注意:我相信我要问的问题要广泛得多,除了生产者/消费者之外,还有一些非阻塞信号量对象的其他用途.如果有人认为我的问题是重复的,请告诉我如何我可以回想一下旧问题,因为这仍然是一个悬而未决的问题.)

c++ multithreading c++11

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

如果getaddrinfo一旦失败就会失败(即使在网络准备就绪后)

我正在编写一个C应用程序,它在启动时作为systemd服务运行(发行版:Arch Linux),并且应该连接到服务器.由于应用程序在引导时运行,因此最终会发生网络连接尚未建立.这自然导致第一个功能失败,需要一个,在我的情况下getaddrinfo.

所以我认为我只会编写一个循环,它会重复调用,getaddrinfo直到网络准备好后它才会成功.不幸的是,我发现即使在建立连接后getaddrinfo仍然失败name or service not known.

我能够通过其主机名ping服务器,但getaddrinfo仍然不会这样做.如果我停止应用程序并再次运行它,一切正常.如果在第一次呼叫之前已建立网络连接,则也getaddrinfo可以正常工作.

显然,如果getaddrinfo由于网络没有准备就失败一次,它将永远失败.似乎没有意识到现有的连接.使用不推荐使用时gethostbyname,行为是相同的.

这种行为的原因是什么?有没有办法强制getaddrinfo刷新内部变量(如果存在)或类似内容,这可能解释为什么函数仍然认为没有连接?是否有其他功能我应该先调用以检查网络是否准备好了?

我想避免等待一段时间的延迟,期待网络之后连接.我还希望从我的应用程序中检查连接,而不是首先检查bash脚本然后启动应用程序.

c linux networking archlinux getaddrinfo

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

ALSA:不支持非交错访问?

当使用SND_PCM_ACCESS_RW_NONINTERLEAVED 访问类型调用时, ALSA 的snd_pcm_hw_params_set_access函数失败,报告存在无效参数。相同的代码适用于SND_PCM_ACCESS_RW_INTERLEAVED 访问

我尝试更改对 snd_pcm_hw_params_* 函数的调用顺序,但没有效果。

接下来我认为我的硬件可能不支持非交错播放,但根据这篇文章,如果 ALSA 子系统本身不支持非交错播放,那么它会在将非交错数据发送到硬件之前交错非交错数据。因此,非交错访问应该始终可用。

那么为什么非交错访问似乎不受支持呢?

以下代码对于交错播放效果很好,但对于非交错播放会产生此问题:

int err;
if ((err = snd_pcm_hw_params_malloc(&hw_params)) < 0) {
    fprintf(stderr, "ALSA: allocate hw_params error: %s\n", snd_strerror(err));
    throw 5;
}
if ((err = snd_pcm_hw_params_any(pb_dev, hw_params)) < 0) {
    fprintf(stderr, "ALSA: hw_params_any error: %s\n", snd_strerror(err));
    throw 5;
}
if ((err = snd_pcm_hw_params_set_access(pb_dev, hw_params, (pAudioCtx->sample_fmt < AV_SAMPLE_FMT_U8P) ? SND_PCM_ACCESS_RW_INTERLEAVED : SND_PCM_ACCESS_RW_NONINTERLEAVED)) < 0) {
    fprintf(stderr, "ALSA: set access type error: %s\n", snd_strerror(err)); …
Run Code Online (Sandbox Code Playgroud)

c alsa

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

标签 统计

c ×2

alsa ×1

archlinux ×1

c++ ×1

c++11 ×1

getaddrinfo ×1

linux ×1

multithreading ×1

networking ×1