所以我只是想知道我是否有一个简单的并发任务,我如何使用来自父进程的fork()和exec()进行多个进程,同时锁定父进程的某些方面'内存(以便它们不会相互覆盖),但以后可以将它们用于这些进程吗?
我知道我可以使用带有互斥锁的POSIX线程执行此操作,但是相同的过程是什么?有没有办法在线程之间“锁定”共享内存?然后我必须“等待()”让其他线程在其他线程可以访问它之前完成这些锁定的内存区域吗?
答案 0 :(得分:0)
如果您正在使用互斥体的pthreads实现,您仍然可以使用它们在进程之间进行同步...您可以将它们放在共享内存中。 Initializing a pthread mutex in shared memory解决了这个问题。
您还可以使用简单的管道来同步访问 - 使用令牌预填充管道,并且需要成功读取令牌以允许资源访问。然后将令牌写回管道以释放资源。
答案 1 :(得分:0)
首先:如果您致电exec
并且成功,那么您的过程影像将被覆盖。您将丢失任何共享内存,您需要使用您喜欢的共享内存范例(例如posix共享内存shm_open
)进行设置。
如果您fork
,那么映射共享的任何内存都将保持共享状态。表示您可以将喜爱的互斥锁(例如pthread_mutex_t
,sem_t
)放入其中,并将其与标准函数一起使用。
void * shared_memory = mmap(
NULL // anywhere
, sysconf(_SC_PAGESIZE) // mmap only works in chunks of pages
// typically 0x1000
, PROT_READ | PROT_WRITE // read-write
, MAP_SHARED // shared
| MAP_ANONYMOUS // anonymous, non-file backed
#ifdef MAP_HASSEMAPHORE
| MAP_HASSEMAPHORE // OS X requires this flag in case you
// intend to have semaphores in that segment
#endif
, -1 // no file backing
, 0
);
if (shared_memory == MAP_FAILED) {
perror("mmap");
abort();
}
// we use that memory to place a mutex tehre
pthread_mutex_t * mutex = shared_memory;
pthread_mutex_init(mutex, NULL);
pid_t pid = fork();
if (pid < 0) {
perror("fork");
abort();
}
if (!pid) {
// child goes here
// use the mutex here
} else {
// parent goes here
// use the mutex here
}