小编sev*_*vko的帖子

为什么我们需要在pthread_cond_wait之前进行条件检查

我正在尝试学习pthread_cond_wait的基础知识.在所有用法中,我也看到了

if(cond is false)
   pthread_cond_wait
Run Code Online (Sandbox Code Playgroud)

要么

while(cond is false)
   pthread_cond_wait
Run Code Online (Sandbox Code Playgroud)

我的问题是,我们只想cond_wait因为条件是假的.那么为什么我要明确地设置一个if/while循环的痛苦.我可以理解,在没有任何if/while检查之前cond_wait我们会直接命中它并且它根本不会返回.条件检查仅用于解决此目的还是具有其他意义.如果它用于解决不必要的条件等待,那么进行条件检查并避免使用cond_wait类似于轮询?我正在使用像这样的cond_wait.

void* proc_add(void *name){
    struct vars *my_data = (struct vars*)name;
    printf("In thread Addition and my id = %d\n",pthread_self());
    while(1){
    pthread_mutex_lock(&mutexattr);
    while(!my_data->ipt){  // If no input get in
            pthread_cond_wait(&mutexaddr_add,&mutexattr);  // Wait till signalled
            my_data->opt = my_data->a + my_data->b;
            my_data->ipt=1;
            pthread_cond_signal(&mutexaddr_opt);
    }
    pthread_mutex_unlock(&mutexattr);
    if(my_data->end)
            pthread_exit((void *)0);
    }
}
Run Code Online (Sandbox Code Playgroud)

逻辑是,我要求输入线程在输入可用时处理数据,并通知输出线程打印它.

c linux multithreading mutex pthreads

17
推荐指数
2
解决办法
8344
查看次数

检查列中是否存在值

我想知道在查询varchar特定表中列中是否存在值时如何最大化速度.我不需要知道它在哪里,或者有多少次出现,我只想要一个true/ false.当然,该列有一个索引.

现在,我有这个:

SELECT exists (SELECT 1 FROM table WHERE column = <value> LIMIT 1);
Run Code Online (Sandbox Code Playgroud)

postgresql

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

为什么我们应该将«Logger»类视为单身?

我们都知道log,ok,但为什么我们应该将«Logger»类视为单例?如果我们把它作为一个普通的单元类,会发生什么?

logging singleton design-patterns

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

如果从本地js文件加载或者包含源代码,则MathJax无法正常工作

我正在本地HTML文件中测试MathJax javascript库.如果我包含以下内容,它可以正确呈现数学公式:

script type='text/javascript' src='http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'
Run Code Online (Sandbox Code Playgroud)

在HTML文件中,但如果我包含它则不起作用:

script type="text/javascript" src="/path_to/mathjax.js"
Run Code Online (Sandbox Code Playgroud)

或者即使我把整个javascript源代码.是什么原因?我需要将mathjax.js从本地js文件加载到本地HTML文件中,所以第一种方法对我没有帮助.(编辑-我看到一个错误:failed to load /extensions/MathZoom.js)

html javascript mathml mathjax

9
推荐指数
2
解决办法
4597
查看次数

是什么导致 Cortex-A72 上带有 -O0 而不是 -O3 的简单紧密循环的周期变化如此之大?

我正在运行一些关于为一段代码获得高度一致的运行时的实验。我目前正在计时的代码是一个非常任意的受 CPU 限制的工作负载:

int cpu_workload_external_O3(){
    int x = 0;
    for(int ind = 0; ind < 12349560; ind++){
        x = ((x ^ 0x123) + x * 3) % 123456;
    }
    return x;
}
Run Code Online (Sandbox Code Playgroud)

我编写了一个内核模块,它禁用中断,然后运行上述函数的 10 次试验,通过获取前后时钟周期计数器的差异来对每次试验进行计时。其他注意事项:

  • 该机器是 ARM Cortex-A72,有 4 个插槽,每个插槽有 4 个内核(每个都有自己的 L1 缓存)
  • 时钟频率缩放关闭
  • 不支持超线程
  • 除了一些基本的系统进程外,机器几乎没有运行

换句话说,我相信系统可变性的大多数/所有来源都被考虑在内,尤其是当作为内核模块运行时,通过禁用中断spin_lock_irqsave(),代码应该实现几乎相同的运行到运行性能(可能是一个小的性能损失在第一次运行时,当一些指令第一次被拉入缓存时,但就是这样)。

实际上,当使用 编译基准代码时-O3,我看到平均范围内最多 200 个周期,其中大约 135,845,192 个周期,大多数试验花费的时间完全相同。但是,当使用 编译时-O0,范围高达 ~262,710,916 中的 158,386 个周期。我所说的范围是指最长和最短运行时间之间的差异。此外,对于-O0代码,对于哪个试验是最慢/最快的并没有太大的一致性——与直觉相反,有一次,最快的是第一个,最慢的是紧随其后的!

那么:什么可能导致-O0代码可变性的上限如此之高?查看程序集,-O3代码似乎将所有内容(?)存储在寄存器中,而-O0代码有一堆对等的引用sp,因此它似乎正在访问内存。但即便如此,我还是希望所有内容都能进入 L1 …

performance assembly arm performancecounter cpu-architecture

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

Prime计数功能的可行实现

任何人都可以提供计算上可行的任何计数功能实现的伪代码吗?我最初尝试编写Hardy-Wright算法,但它的阶乘开始产生可怜的溢出,而其他许多似乎必然会产生类似的问题.我已经在谷歌搜索了实用的解决方案,但最好的是,我发现了非常深奥的数学,这是我在常规程序中从未见过的.

performance primes pseudocode

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

在iphone上推送与拉动通知

推送通知如何比iPhone上的拉动通知更好?

是否有关于此的更多信息的链接?

任何帮助,将不胜感激.

iphone push-notification

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

获取Vim脚本的<SNR>

我想打电话与脚本范围(声明的函数s:在一个执行的Vim脚本),没有硬编码%dcall <SNR>%d_function()或通过修改自己的插件文件曝光功能的全局命名空间.如何以<SNR>编程方式检索其父脚本或脚本编号?

vim

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

在没有跳转的程序集中实现eq,lt gt

是否可以仅使用AND,OR和NOT运算符编写逻辑来比较2个操作数并返回true/false(-1,0)而不使用跳转?如果是的话,请你给我一些提示,因为它对我来说是不可能的.我试图用"计算系统的元素"一书的汇编语言实现eq,lt和gt .

assembly bit-manipulation

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

使用 ncurses 后的 printf()/puts()

我在 C 项目中使用该库,在初始化取消初始化curses 后ncurses遇到了使用printf()/的问题。这是一个简化的说明:puts()

initscr();
endwin();

puts("first");
usleep(1e6);
puts("second");
Run Code Online (Sandbox Code Playgroud)

firstsecond当包含的可执行文件退出后(一秒多一点后), 和 才会出现在屏幕上,而不是先打印,first然后在一秒后打印second. ncurses似乎以stdout某种方式缓冲并且仅在退出时刷新它。fflush(stdout)似乎解决了问题:

initscr();
endwin();

puts("First.");
fflush(stdout);
usleep(1e6);
puts("Second");
Run Code Online (Sandbox Code Playgroud)

stdout手动刷新时,输出将按预期显示(带有第二个间隙)。puts()不过,如果我之后要usleep()在中间添加更多语句,我需要在每个语句之后重复调用fflush(stdout),并且我想知道是否有更好的解决方案,例如将程序永久重置为预诅咒模式。

c ncurses

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