根据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).
我认为应该避免这种结构以保证安全(双向)
在该互斥锁和条件变量之间形成的动态绑定
有人可以评论这个问题吗?
我遇到了这段代码:
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=3和k=1.它将返回true,因此||变为true,因此++i不应进行评估.但它以其他方式工作.
我希望别人向我解释.
我还没有理解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)
两个进程都打印相同的地址.那么它们是否指向堆中的相同内存区域?这不危险吗?可能存在冲突.我的书说复制了堆栈上的值,但它没有谈论堆.
我正在尝试编译程序,但链接失败并显示以下消息:
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++代码使用一个技巧来隐藏结构实现使用相同大小的不透明(阴影)结构:
在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_t并private_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的声明方式没有信心.
这招可能有什么问题?
有什么区别
*(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位系统?
前言
这个问题与(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)