Java逐行读取文件有多少种方法?
- 读模式加锁状态
- 写模式加锁状态
- 不加锁状态
锁状态\需要加的锁 | 读模式加锁 | 写模式加锁 |
读模式 | 允许 | 阻塞直到所有线程释放读锁 |
写模式 | 阻塞直到写锁被释放 | 阻塞直到写锁被释放 |
不加锁 | 允许 | 允许 |
#include <stdio.h> #include <pthread.h> /* 自定义的条件 */ struct msg { struct msg *m_next; char *data; }; struct msg *workq; /* 定义一个消息队列 */ pthread_cond_t qready = PTHREAD_COND_INITIALIZER; /* 静态分配条件变量 */ pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER; /* 静态分配互斥量 */ void process_msg(void) { struct msg *mp; while (1) { pthread_mutex_lock(&qlock); while (workq == NULL) { /* 此函数把线程放到等待条件的线程列表上,然后对互斥量解锁 * 函数返回时,互斥量再次被锁住 */ pthread_cond_wait(&qready, &qlock); } /* 从消息队列头取出一个消息 */ mp = workq; workq = workq->m_next; pthread_mutex_unlock(&qlock); printf("%s\n", mp->data); /* 打印收到的消息 */ } } void enqueue_msg(struct msg *mp) { pthread_mutex_lock(&qlock); mp->m_next = workq; /* 新消息放队列头部 */ workq = mp; pthread_mutex_unlock(&qlock); pthread_cond_signal(&qready); /* 唤醒等待该条件的某个线程 */ } void *thr_fn1(void *arg) { process_msg(); } void *thr_fn2(void *arg) { struct msg msg1, msg2, msg3; msg1.data = "Hello world"; msg2.data = "I love you"; msg3.data = "This is a test!"; /* 将消息放入队列 */ enqueue_msg(&msg1); enqueue_msg(&msg2); enqueue_msg(&msg3); } int main(void) { pthread_t tid1, tid2; pthread_create(&tid1, NULL, thr_fn1, NULL); pthread_create(&tid2, NULL, thr_fn2, NULL); pthread_join(tid1, NULL); return 0; }
- 线程试图对同一个互斥量加锁两次
- 已拥有各自互斥量的两个线程相互请求加锁对方的互斥量
- 假设需要对两个互斥量同时加锁,那么要求所有线程必须先加锁A(或B),再加锁B(或A),死锁就不会发生。只有在一个线程试图以另一个线程相反的顺序锁住互斥量时,才可能出现死锁。
- 使用pthread_mutex_trylock函数,如果不能获得锁,先释放已经拥有的锁,过段时间重新尝试。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。