逐行读取文件 java_Java逐行读取文件有多少种方法?

本文介绍了线程同步的三种机制:互斥量、读写锁和条件变量。互斥量实现串行访问临界区,读写锁允许多线程并发读取,条件变量则允许线程等待特定条件发生。通过示例代码展示了如何在C程序中使用这些机制来管理消息队列。
摘要由CSDN通过智能技术生成

下面介绍线程的三种同步机制:

1、互斥量pthread_mutex_t

互斥量就是锁,对某段临界区进行加锁,使得线程只能串行访问这段临界区。对互斥量进行加锁后,任何其它试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互斥量。

2、读写锁pthread_rwlock_t

与互斥量类似,但并行性更高。读写锁有三种状态:

读模式加锁状态

写模式加锁状态

不加锁状态

一次只有一个线程可以占有写模式的读写锁,但是多个线程可以同时占有读模式的读写锁。下面是读写锁的逻辑关系表:

锁状态\需要加的锁

读模式加锁

写模式加锁

读模式

允许

阻塞直到所有线程释放读锁

写模式

阻塞直到写锁被释放

阻塞直到写锁被释放

不加锁

允许

允许

3、条件变量pthread_cond_t

条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定条件的发生。条件变量(由用户自由定义)本身受互斥量保护,对条件的修改都必须先加锁。

这里要注意条件和条件变量之间的区别。条件变量是由系统提供的结构体pthread_cond_t,它用来在多个线程间传递信号;而条件则由用户代码定义,用于多个线程间共享某些数据。

测试代码:

#include

#include

/* 自定义的条件 */

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;

}

运行结果:

1e4ef9dd8751131a31e604a9731e266f.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值