惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
T
Threatpost
阮一峰的网络日志
阮一峰的网络日志
美团技术团队
F
Fortinet All Blogs
The GitHub Blog
The GitHub Blog
月光博客
月光博客
V
Visual Studio Blog
T
Tailwind CSS Blog
Stack Overflow Blog
Stack Overflow Blog
博客园 - 聂微东
Jina AI
Jina AI
J
Java Code Geeks
Martin Fowler
Martin Fowler
大猫的无限游戏
大猫的无限游戏
Recorded Future
Recorded Future
C
Check Point Blog
腾讯CDC
N
Netflix TechBlog - Medium
aimingoo的专栏
aimingoo的专栏
罗磊的独立博客
Hacker News: Ask HN
Hacker News: Ask HN
SecWiki News
SecWiki News
博客园 - Franky
Hacker News - Newest:
Hacker News - Newest: "LLM"
N
News | PayPal Newsroom
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
Security @ Cisco Blogs
W
WeLiveSecurity
The Last Watchdog
The Last Watchdog
Cloudbric
Cloudbric
F
Full Disclosure
The Cloudflare Blog
Y
Y Combinator Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Google DeepMind News
Google DeepMind News
MongoDB | Blog
MongoDB | Blog
S
Schneier on Security
Schneier on Security
Schneier on Security
Spread Privacy
Spread Privacy
L
LINUX DO - 热门话题
AI
AI
N
News and Events Feed by Topic
T
Tor Project blog
P
Palo Alto Networks Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
H
Hackread – Cybersecurity News, Data Breaches, AI and More
G
Google Developers Blog

博客园 - DarroldYang

Saas模式数据库层数据架构以及数据删除处理 ASP.NET MVC 自定义过滤属性实现Enterprise的log功能 ASP.NET MVC 请求生命周期 ASP.NET MVC HtmlHelper类的方法总结 - DarroldYang (Windows 7 IIS 7.5里面的 IIS and Built-in Accounts) IIS和内置帐户的IIS 用户控件,事件的触发顺序 IIS7.0 An ASP.NET setting has been detected that does not apply in Integrated managed pipeline mode 转ORACLE函数大全 ASP.NET AJAX 调用Service Method (Too simply) Office编程知识点汇总(3)--格式设置 Office编程知识点汇总(2)--基本工作表任务 Office编程知识点汇总:基本工作簿任务 asp.NET应用程序的技巧 CrystalReport的导出“Push”方式 Ajax Control Toolkit MutuallyExclusiveCheckBox 服务器端控件 Ajax Control Toolkit Slider 服务器端控件 Ajax Control Toolkit AlwaysVisibleControl 服务器端控件 Ajax Control Toolkit Accordion 服务器端控件 判断代码执行环境
linux 多线程,锁同步
DarroldYang · 2012-10-20 · via 博客园 - DarroldYang

 POSIX pthread 

libraries 

是基于标准的线程API的C / C ++。并发执行。这是最有效的多处理器或多核心系统的工艺流程,在另一个处理器上运行,从而通过并行或分布式的处理速度越来越快。

简介:

线程库提供了三种同步机制:

mutexes:  互斥锁:主要是阻止其他线程访问变量,强制线程独占一个变量或一组变量

join:         使一个线程等待,直达其他线程完成或者终止(exit(0));

contidion variables: 条件变量,数据类型为 phread_cond_t

详细介绍:

mutexes: 多线程在同一时间在同一块内存区域操作数据,防止数据的不一致. 挣用或者竞争情况 通常发生在多线程,执行的操作在相同的内存区域,比如修改通一个状态变量。锁主要是锁住共享资源, 对于多线程访问的全家变量,需要添加锁。看代码理解

没有锁代码段

int counter =0;

void updateCounter()

{

  counter++

};

带锁代码段

pthread_mutex_t mutext =PTHREAD_MUTEX_INITIALIZER

int counter =0;

void updateCounter()

{

  pthread_mutex_lock(&mutext);

  counter++

 pthread_mutex_unlock(&mutext);

};

重点说明

pthread_mutex_lock() : 获得指定的互斥变量上的锁。如果该互斥已经被另一个线程锁定,这个调用会阻塞调用线程,直到互斥量被释放

pthread_mutex_unlock() - 解除锁定的互斥变量。如果已经解锁或由另一个线程拥有互斥,则返回一个错误

pthread_mutex_trylock() - 试图锁定一个互斥体,会返回错误代码。主要用于防止死锁条件

互斥锁Demo 

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

void * updateCounter();

pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
int counter =0;

main(){

  int rc1,rc2;
  pthread_t thread1,thread2;
  if( (rc1=pthread_create( &thread1, NULL, &updateCounter, NULL)) )
    {
       printf("Thread creation failed: %d\n", rc1);
    }
   if( (rc2=pthread_create( &thread2, NULL, &updateCounter, NULL)) )
     {
         printf("Thread creation failed: %d\n", rc2);
     }
   
    pthread_join( thread1, NULL);
    pthread_join( thread2, NULL);

   exit(0);

}

void * updateCounter(){
 
   pthread_mutex_lock( &mutex1 );

   counter++;

   printf("Counter value: %d\n",counter);

   pthread_mutex_unlock( &mutex1 );
}

gcc -lpthread mutex1.c -o mutext.out

输出:

DavidYang:项目 weflytotti$ ./mutext.out

Counter value: 1

Counter value: 2

Joins Demo

Joins:等待其他线程完成,一个线程调度程序可以启动多个线程,然后等待他们完成 

具体代码

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

#define NTHREADS 10
void *thread_function(void *);
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
int  counter = 0;

main()
{
   pthread_t thread_id[NTHREADS];
   int i, j;

   for(i=0; i < NTHREADS; i++)
   {
      pthread_create( &thread_id[i], NULL, thread_function, NULL );
   }

   for(j=0; j < NTHREADS; j++)
   {
      pthread_join( thread_id[j], NULL);
   }
 
                                            
   printf("Final counter value: %d\n", counter);
}

void *thread_function(void *dummyPtr)
{
   printf("Thread number %ld\n", pthread_self());
   pthread_mutex_lock( &mutex1 );
   counter++;
   pthread_mutex_unlock( &mutex1 );
}

输出:

gcc -lpthread join.c -o join.out

DavidYang:项目 weflytotti$ ./join.out

Thread number 4304330752

Thread number 4305981440

Thread number 4306518016

Thread number 4307054592

Thread number 4307591168

Thread number 4308127744

Thread number 4308664320

Thread number 4309200896

Thread number 4309737472

Thread number 4310274048

Final counter value: 10