有两种应用程序:一种发送信号,另一种接收信号。我想在这两个应用程序之间共享互斥体,条件变量和标志。我使用mmap的解决方案仅适用于一个接收过程,但是添加更多后,我无法获得锁,这似乎是免费的。
我不知道如何解决此问题,但是我几乎可以确定问题出在我通过mmap共享互斥锁的方式中。
provider = DataProvider().engine
session = sessionmaker(bind=provider)()
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = session.execute(query, source='mysource')
发送信号的代码:
typedef struct {
pthread_mutex_t mutex;
pthread_cond_t cond;
int flags[MAX_PROCS];
int ready[MAX_PROCS];
} cb;
用于接收信号的代码:
int main(int argc, char **argv) {
int i, fd, ret;
char handle = '\n';
pthread_mutexattr_t attrmutex;
pthread_condattr_t attrcond;
fd = shm_open("tmp", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
ftruncate(fd, sizeof(cb));
cb *control = (cb*)mmap(NULL,
sizeof(cb),
PROT_READ | PROT_WRITE,
MAP_SHARED,
fd,
0);
pthread_mutexattr_init(&attrmutex);
pthread_mutexattr_setpshared(&attrmutex, PTHREAD_PROCESS_SHARED);
pthread_mutex_init(&control->mutex, &attrmutex);
pthread_condattr_init(&attrcond);
pthread_condattr_setpshared(&attrcond, PTHREAD_PROCESS_SHARED);
pthread_cond_init(&control->cond, &attrcond);
for (i = 0; i < MAX_PROCS; i++) {
control->flags[i] = 0;
control->ready[i] = 0;
}
while (handle != 'q') {
printf("> ");
scanf("%c", &handle);
if (handle == 'p' || handle == 'P') {
for (i = 0; i < MAX_PROCS; i++) {
if (!control->ready[i])
printf("Process %d doesn't exist\n", i);
else
printf("Process %d listening\n", i);
}
}
else if (isdigit(handle)) {
i = atoi(&handle);
printf("Signal sent\n");
pthread_mutex_lock(&control->mutex);
control->flags[i]++;
pthread_cond_broadcast(&control->cond);
pthread_mutex_unlock(&control->mutex);
}
else {
printf("Choose process(es) to signal\n");
printf("P to print attached proceses\n");
printf("CTRL-C to quit\n");
}
if (handle != '\n')
scanf("%c", &handle);
}
exit(0);
}
当我的侦听进程进入等待状态时,互斥体应该可以通过发送进程自由获取,但是它只是阻塞。
P.S。当我开始第二个接收过程时,pthread_cond_wait返回EINVAL错误(错误的参数)。前两个过程只是在等待和广播功能上陷入僵局。不知何故,与一个以上的进程共享内存将破坏存储在共享内存中的互斥量和条件变量。