【发布时间】:2013-12-31 13:38:22
【问题描述】:
我写了一个简单的程序来测试内存同步。使用全局队列与两个共享 进程,并将两个进程绑定到不同的核心。我的代码被炸毁了。
#include<stdio.h>
#include<sched.h>
#define __USE_GNU
void bindcpu(int pid) {
int cpuid;
cpu_set_t mask;
cpu_set_t get;
CPU_ZERO(&mask);
if (pid > 0) {
cpuid = 1;
} else {
cpuid = 5;
}
CPU_SET(cpuid, &mask);
if (sched_setaffinity(0, sizeof(mask), &mask) == -1) {
printf("warning: could not set CPU affinity, continuing...\n");
}
}
#define Q_LENGTH 512
int g_queue[512];
struct point {
int volatile w;
int volatile r;
};
volatile struct point g_p;
void iwrite(int x) {
while (g_p.r == g_p.w);
sleep(0.1);
g_queue[g_p.w] = x;
g_p.w = (g_p.w + 1) % Q_LENGTH;
printf("#%d!%d", g_p.w, g_p.r);
}
void iread(int *x) {
while (((g_p.r + 1) % Q_LENGTH) == g_p.w);
*x = g_queue[g_p.r];
g_p.r = (g_p.r + 1) % Q_LENGTH;
printf("-%d*%d", g_p.r, g_p.w);
}
int main(int argc, char * argv[]) {
//int num = sysconf(_SC_NPROCESSORS_CONF);
int pid;
pid = fork();
g_p.r = Q_LENGTH;
bindcpu(pid);
int i = 0, j = 0;
if (pid > 0) {
printf("call iwrite \0");
while (1) {
iread(&j);
}
} else {
printf("call iread\0");
while (1) {
iwrite(i);
i++;
}
}
}
两个进程Intel(R) Xeon(R) CPU E3-1230和两个核心之间的数据不同步。
CPU:Intel(R) Xeon(R) CPU E3-1230 操作系统:3.8.0-35-generic #50~precise1-Ubuntu SMP
我想知道 IPC 之外的我如何在用户的不同内核之间同步数据 空间?
【问题讨论】:
-
如果您希望两个进程能够相互通信,您将需要使用某种形式的进程间通信。这里有一个关于进程间通信的好答案 -> stackoverflow.com/questions/2682462/c-fork-and-sharing-memory。另外,只是一个观察,你没有初始化你的点结构实例。
-
全局初始化默认为0。谢谢你的链接。
-
我想知道 IPC 之外的东西,是一种从用户空间控制缓存内存的方法。或任何系统调用,如“rmb()、wmb()”
标签: caching multicore memory-barriers