小编Yan*_*aud的帖子

使用一个pthread_mutex_t并将pthread_cond_t与pthread_cond_wait()相乘

根据Open Group Base Specifications Issue 7,IEEE Std 1003.1-2008,单个条件变量(pthread_cond_t)不应该沿着不同的互斥锁(pthread_mutex_t)使用,pthread_cond_wait()而至少有一个线程正在等待这个条件变量:例如.pthread_cond_wait(&cond1, &mutex1)不能与pthread_cond_wait(&cond1, &mutex2)以下内容并行使用:此行为未指定.

但是,如果允许使用具有多个条件变量的单个互斥锁,则不指定,例如:pthread_cond_wait(&cond1, &mutex1)与...并行pthread_cond_wait(&cond2, &mutex1).

我认为应该避免这种结构以保证安全(双向)

在该互斥锁和条件变量之间形成的动态绑定

有人可以评论这个问题吗?

unix posix mutex pthreads conditional-statements

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

&&和|| 运营商

我遇到了这段代码:

    int main()
    {
        int i=1,j=2,k=0,m=0;
        m = ++i || ++j && ++k;
        printf("%d %d %d %d %d",i,j,k,m);
    }
Run Code Online (Sandbox Code Playgroud)

该程序返回2 2 0 1....为什么?

&&具有更高的优先级高于||所以++j && ++k应先评估.因此我会期待j=3k=1.它将返回true,因此||变为true,因此++i不应进行评估.但它以其他方式工作.

我希望别人向我解释.

c boolean operators

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

两个进程共享同一个堆

我还没有理解fork()生成的进程.如果我尝试这样的代码:

int main(int argc, char** argv)
{
    void* mem=malloc(100);
    pid_t pid=fork();
    printf("%p\n",mem);
}
Run Code Online (Sandbox Code Playgroud)

两个进程都打印相同的地址.那么它们是否指向堆中的相同内存区域?这不危险吗?可能存在冲突.我的书说复制了堆栈上的值,但它没有谈论堆.

c heap fork

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

找不到-lX11

我正在尝试编译程序,但链接失败并显示以下消息:

gcc -O2 -pipe -Wl,--导出动态 tkAppInit.o -L/home/dimitriv/ns-allinone-2.35/tk8.5.10/unix -ltk8.5 \
-L/home/dimitriv/ns-allinone- 2.35/tcl8.5.10/unix -ltcl8.5 -lX11 -ldl -lieee -lm -Wl,-rpath,/home/dimitriv/ns-allinone-2.35/lib -o 希望 /usr/bin/ld:找不到 - lX11collect2
:错误:ld返回1退出状态

但是,my$LD_LIBRARY_PATH包含安装 X11 的目录:

回声 $LD_LIBRARY_PATH
/share/apps/cim/lib:/opt/ns2/otcl-1.13:/opt/ns2/lib: /home/dimitriv/local/lib

并且库似乎已正确安装。

ls /home/dimitriv/local/lib | ls /home/dimitriv/local/lib | grep X11
libX11.a
libX11.la
libX11.so
libX11.so.6
libX11.so.6.3.0
libX11-xcb.a
libX11-xcb.la
libX11-xcb.so
libX11-xcb.so.1
libX11-xcb.so .1.0.0
X11

为什么无法找到库并进行链接?

c c++ x11 linker gcc

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

为什么不应该以这种方式隐藏结构实现呢?

我已经看到一些C/C++代码使用一个技巧来隐藏结构实现使用相同大小的不透明(阴影)结构:

private.h,声明了结构的确切实现:

typedef struct private_struct
{
    private_foo_t f1;
    private_bar_t b[2];
    private_baz_t *bz;
    int val;
} private_t;

#define PRIVATE_SIZE (sizeof(private_t))
Run Code Online (Sandbox Code Playgroud)

public.h,公共结构被声明为包含不透明的字节数组:

#include "private.h"

typedef struct public_struct
{
    char opaque[PRIVATE_SIZE];
} public_t;
Run Code Online (Sandbox Code Playgroud)

public_tprivate_t分享相同的大小.

用户可以使用公共结构为私有实现分配自己的存储:

#include <public.h>

int main(void)
{
    public_t pub;

    return public_api(&pub);
}
Run Code Online (Sandbox Code Playgroud)

实现可以访问隐藏的实现:

#include "private.h"

int public_api(public_t *pub)
{
    private_t *priv = (private_t *) pub;

    return priv->val;
}
Run Code Online (Sandbox Code Playgroud)

这似乎是一个非常巧妙的技巧,允许用户为变量分配存储(例如声明静态变量).

我在各种嵌入式系统上使用这个技巧移植专有源代码,但我对结构pub_t的声明方式没有信心.

这招可能有什么问题?

c c++

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

在64位系统中复制unsigned int 2次和unsigned long 1次有什么区别?

有什么区别

*(unsigned*)d = *(unsigned*)s; 
d+=4; s+=4; 
*(unsigned*)d = *(unsigned*)s; 
d+=4; s+=4;
Run Code Online (Sandbox Code Playgroud)

*(unsigned long*)d = *(unsigned long*)s;
d+=8; s+=8;
Run Code Online (Sandbox Code Playgroud)

在64位系统?

c linux 64-bit gcc

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

模数行为背后的数学

前言

这个问题与(P)RNG和rand().的行为无关.它是关于使用以模数均匀分布的两个值的幂.

介绍

我知道不应该使用modulo %将值从一个范围转换为另一个范围,例如从rand()函数中得到0到5之间的值:会有偏差.它在这里解释https://bitbucket.org/haypo/hasard/src/ebf5870a1a54/doc/common_errors.rst?at=default并在这个答案中为什么人们说使用随机数发生器时存在模偏差?

但是今天在调查了一些看起来错误的代码之后,我已经制作了一个工具来演示模数的行为:https://gitorious.org/modulo-test/modulo-test/trees/master 并发现它不够清楚.

骰子只有3位

我检查了范围0..5中的6个值.编码这些值只需要3位.

$ ./modulo-test 10000 6 3
interations = 10000, range = 6, bits = 3 (0x00000007)
  [0..7] => [0..5]

theorical occurences    1666.67 probability 0.16666667

   [   0] occurences    2446    probability 0.24460000 ( +46.76%)
   [   1] occurences    2535    probability 0.25350000 ( +52.10%)
   [   2] occurences    1275    probability 0.12750000 ( -23.50%)
   [   3] occurences    1297    probability 0.12970000 ( -22.18%)
   [   4] occurences    1216    probability 0.12160000 …
Run Code Online (Sandbox Code Playgroud)

random math statistics probability modulo

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