`

使用Mutex实现线程安全的链表功能

阅读更多
1、Mutex是个简单的互斥排它锁
2、Node是链表的节点,没有节点都持有自己的Mutex锁
3、List是链表,在search方法中通过对节点的加锁和解锁达到同步的目的

public class Mutex {
 
  /** 是否锁定的状态位 **/
  protected boolean inuse_ = false;
 
  public void acquire() throws InterruptedException {
    if (Thread.interrupted()) throw new InterruptedException();
    synchronized(this) {
      try {
        while (inuse_) wait();
        inuse_ = true;
      }
      catch (InterruptedException ex) {
        notify();
        throw ex;
      }
    }
  }
 
  public synchronized void release()  {
    inuse_ = false;
    notify(); 
  }
 
}
 
 class Node { 
   Object item; //节点对象,实际使用时可以用领域对象进行替换
   Node next; 
   Mutex lock = new Mutex(); // 每个节点都保存自己的锁对象
 
   Node(Object x, Node n) { item = x; next = n; }
 }
 
 class List {
    protected Node head; 
 
    protected synchronized Node getHead() { return head; }
 
    boolean search(Object x) throws InterruptedException {
      Node p = getHead();
      if (p == null) return false;
 
 
      p.lock.acquire();              // 先加锁,再循环
 
      for (;;) {
        if (x.equals(p.item)) {
          p.lock.release();          // 找到直接释放锁
          return true;
        }
        else {
          Node nextp = p.next;
          if (nextp == null) {
            p.lock.release();       // 没有找到对象,也要释放锁
            return false;
          }
          else {
            try {
              nextp.lock.acquire(); // 给链表下一个节点加锁
            }
            catch (InterruptedException ex) {
              p.lock.release();    // 加锁如果失败,也要释放前一个节点的锁
              throw ex;
            }
            p.lock.release();      // 加锁成功,释放前一个节点的锁
            p = nextp;
          }
        }
      }
    }
 
    synchronized void add(Object x) { // simple prepend
      head = new Node(x, head);
    }
 
    // ...  
 }
分享到:
评论

相关推荐

    多线程下写入链表的同步问题

    此函数实现了向链表尾部添加元素的功能。由于是在单线程环境下执行,因此无需担心多个线程同时访问同一资源带来的问题。 #### 三、多线程环境下的链表插入问题 当将同样的链表插入操作放在多线程环境中时,问题变...

    udp多线程实现多客户端并发,并采用链表实现服务器群发消息

    通过上述方法,我们可以构建一个高效的UDP多线程服务器,能够处理大量并发客户端的请求,并利用链表结构实现服务器向所有客户端的群发消息功能。这种设计既满足了实时性需求,又保证了服务器的并发性能。

    网上搜集的七种双向链表模板c++实现

    在多线程环境下,为了确保数据一致性,可以使用互斥锁(mutex)实现线程安全的双向链表。每个操作(如插入、删除)都需加锁,防止并发冲突。 3. **模板化的双向链表** C++的模板机制使得双向链表可以存储不同类型...

    内存池的实现 只能支持单线程 C++实现

    VC++标准库中提供了`std::mutex`类,可以用于实现线程安全的内存池。 总的来说,这个内存池的实现提供了一个基础的内存管理框架,适用于那些内存分配频繁但不涉及多线程的C++应用程序。通过理解并分析源代码,我们...

    航空订票系统--链表实现.rar

    因此,需要使用锁机制,如互斥锁(Mutex)或读写锁(Read-Write Lock),确保在并发操作时的数据安全性。 此外,为了优化查询性能,可以结合哈希表(Hash Table)和链表。哈希表提供快速查找功能,将航班号、乘客...

    多线程BUFFER例子

    2. 通过`std::mutex`实现线程同步,保护共享资源。 3. 使用`std::condition_variable`实现条件等待,提高线程间的协作效率。 4. 设计并实现生产者-消费者问题,理解其工作原理和解决方法。 通过这个例子,开发者...

    用到了模板链表的实现

    然而,在多线程环境下,为了防止数据竞争,我们需要使用互斥锁(mutex)等同步机制来保护对链表的操作。 在`Hash_0310`这个文件或工程中,我们可以假设它包含了上述链表实现的源代码。可能还包括了对链表的一些测试...

    linux 内核链表在用户态的应用

    为了在用户态使用,我们需要包含用户态版本的链表库,如GlibC中的`g_list`或自定义实现的用户态安全版本的链表操作。 2. **内存管理**:在内核中,链表节点通常是静态分配的,而在用户态,我们可能需要动态分配和...

    多线程端口扫描

    这需要熟练掌握异步编程和并发控制,如互斥量(mutex)、条件变量(condition_variable)等,以确保线程安全和资源的有效利用。 实现多线程端口扫描的步骤大致如下: 1. **目标主机和端口范围**:确定要扫描的主机...

    c语言多线程群聊,替换之前的

    为了避免数据竞争,当一个线程访问或修改链表时,其他线程可能需要等待,这需要用到`pthread_mutex_lock()`和`pthread_mutex_unlock()`函数。同时,为了确保消息的顺序一致性,可能还需要使用信号量或者条件变量。 ...

    Linux C系统编程:使用线程池实现cp命令

    总结起来,Linux C系统编程中使用线程池实现类似`cp`命令的功能,是一个涉及多线程编程、任务调度和同步控制的综合实践。通过这样的实现,我们可以提高文件复制操作的并发性和效率,同时降低系统资源的消耗。在深入...

    线程同步及数据结构

    1. **互斥量(Mutex)**:互斥量是一种锁机制,一次只有一个线程可以获取锁,其他线程必须等待。当一个线程获得了互斥量,其他试图获取该锁的线程将被阻塞,直到该线程释放锁。 2. **信号量(Semaphore)**:信号量...

    linux下C语言实现线程池

    1. **线程池队列**:存储待处理任务的队列,通常使用链表或数组实现。 2. **工作线程**:从线程池队列中取出任务并执行的线程。 3. **同步机制**:如互斥锁(mutex)、条件变量(condition variable)等,用于保证...

    linux线程启动

    - 在Linux内核中,使用`mutex`来实现互斥锁。 2. **自旋锁**: - 自旋锁用于快速锁定/解锁场景,适用于短时间锁定。 - 在内核中广泛使用自旋锁来保护共享数据结构。 3. **读写锁**: - 读写锁允许多个读操作...

    RTT-Mini-mutex.rar

    RTT,即RT-Thread,是一个广泛使用的开源RTOS,它提供了丰富的内核功能,如任务管理、信号量、互斥锁等,以支持多任务并发执行。本项目将介绍如何模仿RTT实现一个简易的互斥锁机制,这个互斥锁不包含优先级继承或...

    linux下的多定时器,采用链表来维护定时器list,可利用其中的接口来创建定时器,并注册超时callback。计时采用select系统调用来实现。

    在多线程环境下,添加、删除和更新定时器的操作必须进行同步,可能需要使用互斥锁(`pthread_mutex_t`)来保证数据一致性。 总结起来,这个简单的Linux定时器实现提供了一个基础的框架,帮助初学者理解如何在C语言...

    C++,线程互斥,ajax+jquery实现客户与服务器连接的面试预约.zip

    线程互斥通过使用互斥量(mutex)来实现,当一个线程获得了互斥量的所有权,其他试图获取同一互斥量的线程将被阻塞,直到该线程释放互斥量。在C++11及以后的版本中,标准库提供了`std::mutex`类来支持这一功能。使用...

    Linux环境下C语言实现简单线程池.zip

    2. **线程同步**:为了确保线程安全地访问共享资源,如任务队列,我们需要使用互斥锁(`pthread_mutex_t`)来实现线程间的同步。互斥锁可以防止多个线程同时进入临界区,避免数据竞争。 3. **条件变量**(`pthread_...

    操作系统课程设计--多线程解决理发师问题

    这可能需要自定义数据结构(如链表或数组)来存储顾客信息,并在顾客线程中更新这些信息,同时确保显示操作的线程安全,避免竞态条件。 在实现过程中,至少需要10个顾客,每个顾客理发至少3秒,这可以模拟真实场景...

    消息队列的实现

    在VC中,可以使用多种数据结构,如链表或队列,来实现一个自定义的消息队列。消息通常包含一个消息类型标识和相关的数据,如参数。队列的一端负责添加新消息,另一端负责消费消息,确保了先进先出(FIFO)的顺序。 ...

Global site tag (gtag.js) - Google Analytics