linux 多线程,锁同步

来源:互联网 发布:java数组倒序排列 编辑:程序博客网 时间:2024/04/30 11:21

 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

原创粉丝点击