C 同步线程,互斥

C 同步线程,互斥,c,multithreading,synchronization,mutex,sync,C,Multithreading,Synchronization,Mutex,Sync,我正试着做作业,但我被这些线索困住了。。创建线程时调用此函数: size_t* mines, gold = 0, gold_collected = 0; pthread_mutex_t mine_mutex; int last_mine = 0; void* dig(void *mine_start) { int current_worker = (int)mine_start; int mine = (int)mine_start; // prin

我正试着做作业,但我被这些线索困住了。。创建线程时调用此函数:

size_t* mines, gold = 0, gold_collected = 0;
pthread_mutex_t mine_mutex;
int last_mine = 0;

void* dig(void *mine_start) {
        int current_worker = (int)mine_start;
        int mine = (int)mine_start;

//      printf("Hello, it's me, thread %d\n", current_worker);

        while(gold != 0) {
                if(mine > last_mine - 1) {
                        mine = 0;
                }
                pthread_mutex_lock(&mine_mutex);
                if(mines[mine] != 0) {
                        //printf("All gold %zd\n", gold);
                        //printf("Gold in mine %zd with number %d\n", mines[mine], mine);
                        printf("Worker %d entered mine %d\n", current_worker, mine);
                        gold -= 10;
                        mines[mine] -= 10;
                        gold_collected += 10;
                        //sleep(1);    
                }
                pthread_mutex_unlock(&mine_mutex);
                ++mine;
        }
        pthread_exit(NULL);
}

我的问题是,当我有5个矿山和2名工人时,只有一名工人进入矿山挖掘黄金。如何旋转线程以便所有线程都可以从矿井中挖掘?

两个矿井只有一个互斥锁,因此只有一个工人可以在矿井中工作。如果每个矿井有一个互斥器,那么两个工人可以同时进入矿井(每个矿井一个工人)

如果你希望每个矿井有一名矿工,但是你的矿工比矿井多,那么你必须决定当所有矿井都在使用时,闲置的矿工将做什么。此外,如果每个矿场都有一个互斥锁,并且每个人都尝试使用第一个互斥锁,那么只有一个矿主会赢,其他矿主仍然会阻止。你可以使用试锁,但是当所有的矿井都满了的时候,矿工们会忙着等待

您可以使用一个用地雷数量初始化的信号量。每个矿工在成功获得信号灯后都会知道有一个矿井可供他们使用,但他们不知道是哪个矿井。您可以使用一个互斥来保护所有处于使用状态的地雷。在获取信号量之后,您将获取互斥锁,查找可用的地雷,将其标记为正在使用,释放互斥锁并开始挖掘。然后,完成后,重新获取互斥锁,将地雷标记为可用,释放互斥锁,然后释放信号量

最后,您可以使用条件变量和互斥量来代替信号量。获取互斥锁,并搜寻可用的地雷。如果找不到,请在condvar上阻塞。如果确实找到了,请将其标记为正在使用,释放互斥锁,然后开始挖掘。完成后,重新获取互斥锁,将地雷标记为可用,向condvar发送信号,然后释放互斥锁。在condvar上唤醒的线程将自动重新获取互斥锁,并且应该循环并重新搜寻可用的地雷。在这种情况下,发出condvar信号而不是广播信号就足够了;虽然广播可以更安全


此外,一旦你有了平行采矿者,你将不得不重新思考全球黄金和黄金的收集。由于您的矿工将在不持有互斥锁的情况下进行实际挖掘,因此他们无法在挖掘时更新这些全局变量。他们应该保存本地的黄金开采量记录,并在重新获得互斥锁后更新全球数据。也许在矿工进入矿场之前可以扣除黄金,而在离开矿场后收集的黄金会更新(两者都是在持有互斥锁时)。当不持有互斥锁时,读取黄金也有点不确定,因为它可能会在你下面发生变化…

嗨-人们通常懒得点击另一个链接。请将相关代码复制到你的问题中。好的,我会编辑我的帖子。@Tarynest让我笑了。谁是这里真正懒惰的人?:)容易的。每个矿井一个互斥器。如果你说人们懒惰,他们往往反应不好;)所以请指出,其他人也很懒惰,如果不迎合他们,他们就得不到他们想要的东西……谢谢。但是当地雷数组是动态的时,我找不到如何动态地创建互斥体