1、基本概念
线程互斥,当有多个线程同时访问同一资源时,就需要使用互斥机制进行控制
互斥锁就是为实现这一业务场景所出现的,使用时主要涉及上锁、解锁操作
一个线程从锁中获取上锁条件,此时若锁已经上锁,则阻塞,若未上锁,则上锁之后执行解锁,将上锁条件解锁掉。
2、主要函数
//锁属性初始化
int pthread_mutexattr_t(pthread_mutexattr_t *mutexattr)
//锁初始化
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
//卡锁
int pthread_mutex_lock(pthread_mutex_t *mutex);
//解锁
int pthread_mutex_unlock(pthread_mutex_t *mutex);
//锁销毁
int pthread_mutex_destroy(pthread_mutex_t *mutex)
//锁属性销毁
int pthread_mutexattr_destroy(pthread_mutexattr_t *mutexattr)
3、使用示例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
pthread_mutex_t mutex1;
pthread_mutex_t mutex2;
void* pthread_demo(void* arg)
{
char ch = 'a';
while(1){
pthread_mutex_lock(&mutex1); //上锁
printf("%c\n", ch);
if(++ch > 'z') ch = 'a';
//sleep(1);
pthread_mutex_unlock(&mutex1);//解锁
}
return NULL;
}
int main(void)
{
//初始化互斥锁
pthread_mutexattr_t mutex_attr; //互斥锁属性
pthread_mutexattr_init(&mutex_attr); //初始化互斥锁属性
pthread_mutex_init(&mutex1, &mutex_attr);
pthread_mutex_init(&mutex2, &mutex_attr);
pthread_mutexattr_destroy(&mutex_attr);//销毁属性对象
pthread_mutex_lock(&mutex2);
pthread_t pid;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&pid, &attr, pthread_demo, NULL);
char ch = '0';
while(1){
pthread_mutex_lock(&mutex1); //上锁
printf("%c\n", ch);
if(++ch > '9') ch = '0';
//sleep(1);
pthread_mutex_unlock(&mutex1);//解锁
}
return 0;
}
4、读写锁
//初始化读写锁
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
//销毁读写锁
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
//尝试请求读锁
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
//渡请求写锁
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
//尝试请求读锁,非阻塞方式
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
//尝试请求写锁,非阻塞方式
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
//解锁
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
读写锁,与互斥量类似,但读写锁允许并行性。
主要特性:写独占,读共享。这样就可以达到同时多个线程读取同一数据。但是是读写是互斥的,即任意时刻,读与读不互斥,但读写互斥。故读写锁非常适合于对数据结构读的次数远大于写的情况。
5、其它说明
全缓存概念:
要求填满整个缓存区后才进行I/O系统调用操作,对于磁盘文件通常使用全缓存访问。
行缓存
涉及一个终端时,(例如标准输入和标准输出),使用行缓存。
行缓存满自动输出
碰到换行符自动输出
无缓存
标准错误流stderr通常量不带缓存区的,这使得错误信息能够尽快地显示出来。
C中的FILE结构体
typedef struct iobuf{
int cnt; //剩余的字节数
char *ptr; //下一个字符的位置
char *base; //缓冲区的位置
int flag; //文件访问模式
int fd; //文件描述符
}FILE;