APUE//线程同步2

时间锁

#include <pthread.h>
#include <time.h>
int pthread_mutex_timedlock(pthread_mutex_t * restrict mutex, const struct timespec *restrict tsptr);

愿意等待timespec描述的时间,达到时间返回错误码ETIMEOUT
一个例子

// APUE example11-13                                       
// pthread_mutex_timedlock                                 
// lcl 20190325                                            
//                                                         
#include "../myapue.h"                                     
#include <pthread.h>                                       
#include <time.h>                                          
                                                           
int main (void)                                            
{                                                          
    int err;                                               
    struct timespec tout;                                  
    struct tm *tmp;                                        
    char buf[64];                                          
    pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;      
                                                           
    pthread_mutex_lock(&lock);                             
    printf("the mutex now is locked\n");                   
    clock_gettime(CLOCK_REALTIME, &tout);                  
    tmp = localtime(&tout.tv_sec);                         
    strftime(buf, sizeof(buf), "%r", tmp);                 
    printf("current time is %s\n",buf);                    
                                                           
    tout.tv_sec += 10;                                     
    err = pthread_mutex_timedlock(&lock,&tout);            
                                                           
    clock_gettime(CLOCK_REALTIME, &tout);                  
    tmp = localtime(&tout.tv_sec);                         
    strftime(buf,sizeof(buf), "%r", tmp);                  
    printf("the time is now %s\n",buf);                    
                                                           
    if(err == 0)                                           
      printf("mutex locked again!\n");                     
    else                                                   
      printf("can't lock mutex again:%s\n",strerror(err)); 
    exit(0);                                               
}                                                          
                                                           
                                                           

运行结果:

the mutex now is locked
current time is 01:08:51 PM
the time is now 01:09:01 PM
can't lock mutex again:Connection timed out

读写锁,三种状态读加锁、写加锁和不加锁

#include <pthread.h>
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,
                                      const pthread_rwlockattr_t *restrict attr);
int pthread_rwlock_destory(pthread_rwlock_t *rwlock);

int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock)
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock)
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock)

如上,函数名可以很好的反映函数的功能。

  • 写锁阻塞其他加锁
  • 读锁阻塞写锁但不阻塞读锁
  • 写锁在阻塞时,不再响应其他读锁请求。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 线程 在linux内核那一部分我们知道,线程其实就是一种特殊的进程,只是他们共享进程的文件和内存等资源,无论如何对...
    大雄good阅读 684评论 0 2
  • 多线程三个特征:原子性、可见性以及有序性. 同步锁 /并发锁/ 读写锁,显示锁, ReentrantLock与Co...
    架构师springboot阅读 1,981评论 0 5
  • 概念 线程同步的方法有多种,互斥量、信号量、条件变量、读写锁等。互斥量在允许或阻塞对临界区的访问上是很有效的,线程...
    蓝雪冬荷阅读 1,095评论 0 3
  • 线程池ThreadPoolExecutor corepoolsize:核心池的大小,默认情况下,在创建了线程池之后...
    irckwk1阅读 773评论 0 0
  • 一、互斥量 1、为什么要使用互斥量 当多个线程共享相同的内存时,需要每一个线程看到相同的视图。当一个线程修改变量时...
    3e1094b2ef7b阅读 150评论 0 0