`
东边日出西边雨
  • 浏览: 262239 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

带锁的多线程

阅读更多

带锁的多线程。

Mutexes:

Mutexes are used to prevent data inconsistencies due to operations by multiple threads upon the same memory area performed at the same time or to prevent race conditions where an order of operation upon the memory is expected. A contention or race condition often occurs when two or more threads need to perform operations on the same memory area, but the results of computations depends on the order in which these operations are performed. Mutexes are used for serializing shared resources such as memory. Anytime a global resource is accessed by more than one thread the resource should have a Mutex associated with it. One can apply a mutex to protect a segment of memory ("critical region") from other threads. Mutexes can be applied only to threads in a single process and do not work between processes as do semaphores.

 

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void *functionC();

pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
int  counter = 0;

main()
{
   int rc1, rc2;
   pthread_t thread1, thread2;

   /* Create independent threads each of which will execute functionC */

   if( (rc1=pthread_create( &thread1, NULL, &functionC, NULL)) )
   {
      printf("Thread creation failed: %d\n", rc1);
   }

   if( (rc2=pthread_create( &thread2, NULL, &functionC, NULL)) )
   {
      printf("Thread creation failed: %d\n", rc2);
   }

   /* Wait till threads are complete before main continues. Unless we  */
   /* wait we run the risk of executing an exit which will terminate   */
   /* the process and all threads before the threads have completed.   */

   pthread_join( thread1, NULL);
   pthread_join( thread2, NULL); 

   exit(0);
}

void *functionC()
{
   pthread_mutex_lock( &mutex1 );
   counter++;
   printf("Counter value: %d\n",counter);
   pthread_mutex_unlock( &mutex1 );
}

 

 

Results:

Counter value: 1
Counter value: 2

When a mutex lock is attempted against a mutex which is held by another thread, the thread is blocked until the mutex is unlocked. When a thread terminates, the mutex does not unless explicitly unlocked. Nothing happens by default.

分享到:
评论

相关推荐

    C#多线程读写sqlite

    测试部分可能会比较不同并发策略下的性能差异,如单线程、多线程无锁、多线程带锁等。 总结来说,理解和掌握这些知识点对于在C#中高效且安全地实现多线程读写SQLite数据库至关重要。通过合理利用多线程并正确实施...

    java多线程之并发锁

    Java 多线程之并发锁 Java 中的多线程编程是指在一个程序中同时运行多个线程,以提高程序的执行效率和响应速度。在多线程编程中,线程间的同步是非常重要的,因为不同的线程可能会同时访问同一个共享资源,导致数据...

    泛型单例父类(带锁线程可释放)

    泛型单例父类(带锁线程可释放),很好用的一个泛型单例父类,想将一个类变成单例类的时候,只有继承这个...而且带线程锁,不怕多线程的时候出现错误了,而且还能手动释放;完全成品.cs文件,直接扔项目里就能用;好用的不得了;

    Android例子源码解决多线程读写sqlite数据库锁定问题

    如果多线程同时读写(这里的指不同的线程用使用的是不同的Helper实例),后面的就会遇到android.database.sqlite.SQLiteException: database is locked这样的异常。对于这样的问题,解决的办法就是keep single ...

    Fine-Grained-Synchronization:带锁的多线程

    带锁的多线程 牛头怪的生日派对 牛头怪邀请了N位客人参加他的生日聚会。 客人到来时,他宣布以下消息。 客人可以一次进入迷宫,只有在他邀请他们进入时才可以进入。 在迷宫的尽头,牛头怪将生日蛋糕放在盘子上。 当...

    Atmospheric-Temperature-Reading-Module:带锁的多线程

    带锁的多线程 同步方式:细粒度 该模块的设计负责测量下一代Mars Rover的大气温度,配有多核CPU和8个温度传感器。 传感器负责定期收集温度读数并将其存储在共享的存储空间中。 大气温度模块必须在每个小时结束时编辑...

    Java 多线程同步 锁机制与synchronized深入解析

    Java中的多线程同步是一种控制并发访问共享资源的方式,以防止数据不一致和线程冲突。锁机制是Java实现同步的主要手段,其中synchronized关键字扮演了核心角色。 synchronized可以用于修饰方法或代码块,两者在锁的...

    Linux系统对文件进行加锁

    在多线程编程环境中,确保数据的一致性和完整性至关重要,特别是在涉及到共享资源,如文件时。Linux系统提供了多种机制来防止并发写入同一文件时出现的冲突和数据损坏,其中Flock函数是一种常用的方法。本篇文章将...

    举例讲解Python编程中对线程锁的使用

    在Python编程中,多线程编程是非常常见的技术手段,尤其是在需要处理大量并发任务或实现资源高效利用时。然而,由于Python解释器本身的全局解释器锁(GIL)机制的存在,同一时刻只有一个线程能够在CPU上运行。尽管...

    第三节 单例模式1

    如上文代码所示,这种模式在多线程环境下存在线程安全问题,因为当多个线程同时检查`instance`是否为`nil`时,可能会导致多个线程都创建单例对象,从而违背了单例模式的初衷。 2. **带锁的单例模式**: 为了解决...

    jdk8_144X86.rar

    "lib" 文件夹存储了JDK的库文件,这些文件包含了许多Java类库,如核心类库、网络编程、I/O操作、多线程等,这些都是编写Java程序的基础。 "RELEASE" 文件通常包含了发行版的具体信息,比如版本号、发布日期等,可以...

    开源消息队列lockedqueue.h、msgqueue、rte-ring

    在多线程环境下,锁机制可以确保在任何时候只有一个线程能访问队列,从而避免数据竞争。lockedqueue.h可能包含了一组API,用于创建、插入、删除和读取消息,同时使用互斥锁或其他同步原语来确保并发访问的安全性。 ...

    nachos实验报告 3 lab3

    - Exercise4:Condition类增加了V_All()函数,可以唤醒所有等待的线程,这对于解决多线程协作问题非常关键。 **内容三:遇到的困难及解决方法** 这部分可能涉及了在实现并发控制时遇到的问题,如死锁、活锁、饥饿等...

    ULima_JAVA_Repaso:Progra Java 2015I评估

    ##理论评论:###线程:#####多任务与多进程:在多任务中,您同时执行多个进程,而在多进程中则意味着并行处理,即一个任务同时在多个进程中运行。 为此,任务分为多个线程。 在多任务处理中,任务进入处理器,并带...

    缓存使用场景,介绍redis/内存等缓存的使用场景,更新策略等

    主动刷新策略,更新任务是一个单独的线程,与查询线程相隔离。缓存通常设置成永不过期(当使用内存作为缓存介质),或者设置成一个远大于缓存更新频率的时常(当使用Redis作为缓存介质)。 缓存使用场景非常广泛,...

    OpenNI中文用户指南

    **2.7 应用程序和带锁节点之间共享设备(Sharing Devices between Applications and Locking Nodes)** - **定义**: 多个应用程序可能会尝试访问同一台设备,为了保证数据的一致性和避免冲突,需要实现设备的共享机制...

Global site tag (gtag.js) - Google Analytics