使用文件锁的进程之间的条件变量

时间:2019-07-13 03:08:36

标签: c++ c linux multiprocessing mutex

我想同步多个进程。我提出了两种潜在的方法: 1.文件锁 2.使用共享内存在进程之间互斥

但是共享内存有点复杂,我不确定是否可以使用它而不会对进程中运行的其他模块产生副作用。所以我更喜欢文件锁定方法。

但是文件锁定仅提供shared lockexclusive lock,没有条件变量(据我所知。)。还有其他选择吗?还是我别无选择,只能共享内存?

已添加:

我想要条件变量的原因是我想限制共享锁持有者的数量

我想出了一种方法,它只使用一个简单的排他文件锁,如下面的伪代码所示:

RETRY:
file_lock.unique_lock();
if (counter == MAX_PROCESS_ALLOW) {
  file_lock.unlock();
  goto RETRY;
}
// successful get into the pool
++counter;
file_lock.unlock();

// do some thing here

// exit the pool
file_lock.unique_lock();
--counter;
file_lock.unlock();

但是这种方法的问题是查询繁忙。或者我可以选择睡觉,但是很难确定睡眠时间。...

1 个答案:

答案 0 :(得分:0)

考虑使用,

public static void main(String[] args) {
    int val;
    int evcounter = 0;
    int odcounter = 0;
    Scanner sc = new Scanner(System.in);
    System.out.println("Enter total no of elements ");
    val = sc.nextInt();
    System.out.println("Enter values ");
    String[] n = new String[val];

    String[] eve = new String[(int) Math.ceil(val/2D)];
    String[] odd = new String[val/2];

    for (int i = 0; i < n.length; i++) {
        n[i] = sc.next();

        if (i % 2 == 0) {
            eve[evcounter] = n[i];
            evcounter++;
        } else {
            odd[odcounter] = n[i];
            odcounter++;
        }
    }
    System.out.println("Even array: " + Arrays.toString(eve));
    System.out.println("Odd array: " + Arrays.toString(odd));
}

任何具有权限的进程都可以修改计数,这将释放等待锁定的进程。这将允许进行复杂的评估。在sem_open(...)中设置“值”将确定可以共享锁的进程数。有关详细信息,请参见手册页。有许多支持功能。以下代码是一个示例。如果您构建并执行了4次以上,那么您将看到迟来的初学者等到早先的初学者完成。

请注意,/ dev / shm / sem.test_sem是Debian Buster与Linux内核共享的资源。代码示例如下:

sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value);
int sem_wait(sem_t *sem);
int sem_getvalue(sem_t *sem, int *sval);
int sem_post(sem_t *sem);
int sem_close(sem_t *sem);
int sem_unlink(const char *name);

请注意,sem_unlink(...)将从文件系统中删除信号量。