我正在尝试使用获取和增量算法(类似于面包店算法)在C中实现互斥。 我已经实现了获取并自动添加了一部分。 我让每个线程都获得一个票证编号,然后等待其“显示”。 但是,我还没有找到一种方法来解决等待您显示票证的问题。 我曾考虑过使用一个队列来存储您的线程ID,并自己解密/屈服,直到拥有锁的人将您唤醒。 但是,我也需要为队列加锁! :(

关于如何确保队列插入安全或使用队列的其他方法,我有什么建议吗?

这是我最初实现的一些代码:

void mutex_lock( mutex_t *mp ) {
  while (compareAndSwap(&(mp->guard), 0, 1) == 1) {
    // This will loop for a short period of time, Need to change this <--
  }
  if ( mp->lock == 1 ) {
    queue_elem_t elem;
    elem.data.tid = gettid();
    enq( &(mp->queue), &(elem) );
    mp->guard = 0;
    deschedule();
  }
  else {
    mp->lock = 1; // Lock the mutex
    mp->guard = 0; // Allow others to enq themselves
  }
}

另外,现在让我们忽略潜在的竞争条件,在这种情况下,有人可以在调用调度之前调用make_runnable,我可以编写另一个系统调用,说我们将要调度,因此将make_runnable调用排队。

  ask by CR7 translate from so

本文未有回复,本站智能推荐:

1回复

在C中实现Mutex的问题

我正在实现一个程序,以读取带有房间名称,连接和房间类型的文件名。 例如: 该程序旨在向用户显示他们正在进入的房间,要求用户输入信息,检查输入内容是结束房间还是其他连接。 如果是另一个连接,将再次显示提示。 如果用户到达游戏室,则游戏结束。 但是,我需要实现一个互斥锁,如果用户输入
2回复

锁定结构 C 中的 pthread_mutex_t

我在一个结构中有一个pthread_mutex_t aka 锁,我创建了 2 个结构。 那些是同一个锁吗? 或者它们是完全不同的锁? 我有一个使用结构锁的函数,一个结构能检测到另一个结构锁是否被使用吗?
3回复

同步中的 pthread_mutex_lock 问题

我一直在研究在 C 中使用 pthread 库的代码。代码执行以下操作: Main 创建两个线程,每个线程都有自己的线程例程(函数) 一个线程(线程1)生成一个随机数并赋值给一个全局变量x 然后另一个线程(线程2)基本上就是打印全局变量的值 这个生成并打印x的随机值的操作重复了5次
1回复

Mutex-使用线程计算文件中char的出现

嗨,我正在编写一个代码,用于计算使用线程在一个或多个文件中某个字母的出现次数。 我必须为每个文件使用一个线程,然后使用互斥量修改全局总数。 这是我的代码: 我不知道哪里出了问题,但是使用一些带有字母束的文件,结果却很奇怪。 运行此行./a.out f file1.in lo
1回复

如何从FreeBSD / Mac OS X中的Mutex对象获取所拥有的线程ID

我正在尝试获取在Mac OS X中调用mutex对象上的锁的线程ID。但是Mac OS X中的互斥对象似乎没有互斥对象的所有者线程ID。 Linux中pthread_mutex_t的定义: 在Mac OS X / FreeBSD中定义pthread_mutex_t : 你可
3回复

厕所关键例子中Binary Semaphore和Mutex之间的区别?

我已经在Stackoverflow上阅读了关于此主题的帖子,但无法理解要点。 也许我们可以将它们的差异限制在一个具体的例子 带锁的卫生间。 Mutex:一个线程接受密钥进入。如果任何其他线程需要进入厕所,他们等待。 当前所有者出来并将钥匙交给警卫(OS内核),后者将厕所的船主交给另一
1回复

C中共享内存环境中的互斥实现

我想实现(C)基于共享内存的通信生产者/消费者机制。 它替代了客户端和远程服务器之间的流套接字通信。 网络中的节点共享一个内存池以彼此通信。 服务器可以在内存区域中写入数据(产生),而客户端应该读取(消耗)数据。 我的软件实际上使用读取线程(客户端)和写入线程(服务器端)。 线程驻留在
2回复

使用Mutex进行锁定和同步

我正在创建一个程序,它将在多个进程和多个线程中运行相同的功能,因此我创建了一个函数来实现锁定和同步,这是 我正在使用它,如下所示 这是锁定此功能的正确方法吗? 还是我需要使用其他方法。 注意:我使用“全局”是因为我的应用程序的某些部分是winService,我需要在会话隔