双线程高效与存储策略分析.pdfVIP

  • 1
  • 0
  • 约1.11万字
  • 约 12页
  • 2026-02-03 发布于北京
  • 举报

游戏之乐_1。10_双线程高效

问题提出

从网络上数据,然后到硬盘上。

问题分析

简单的做法是:先一部分,然后写入硬盘,再继续,再

写入硬盘。

缺点:需要先完才能写入硬盘,和写是串行操作。

改进:让两个线程并行进行,设置缓冲区,采用信号量的形式。

线程,只要缓冲区有空余就,完成后写入线

程缓冲区已有数据。

写线程,只要缓冲区有数据就写入,写完后告诉线程缓冲区

有空闲了。

不是一次完,而是把分成很多部分,每次一个部

分到缓存。到硬盘也不是只进行一次,而是每次从缓存区一块

到硬盘中。

解法

基本的思路:

这个问题相当于生产者和消费者模型的问题。

首先定义两个线程,一个是线程,一个是线程。线程

将数据从网络到相应的数据缓冲区中(由BLOCK组成的队列)。

线程从数据缓冲区中相应数据,并将其写入相应的磁盘。

游戏之乐_1.10_双线程高效

问题提出

网络上数据,然后到硬盘上。

问题分析

简单做法是:先一块然后写到硬盘,然后再,再写到硬

盘上。

缺点:需要先完才能写入硬盘,和写是串行操作。

改进:让两个线程并行进行,设置缓冲区,采用信号量的形式。

线程,只要缓冲区有空余就,完成告诉写线程

缓冲区有数据了。

写线程,只要缓冲区有数据就写入,写完后告诉线程缓冲区

有空闲了。

不是一次完,而是把分成很多部分,每次一个部分

到缓存。到硬盘也不是只进行一次,而是每次从缓存区一块

到硬盘中。

解法

基本的思路:

这个问题相当于是生产者和消费者模型的问题

首先定义两个线程,一个是线程,一个是线程,线程

将数据从网络上到相应的数据的缓冲区中(BLOCK组成的队列)。

的线程从数据缓冲区中相应的数据,并将其写到相应的磁盘上去。

多线程同步的方式包括:CriticalSection、Mutex和

Semaphore(信号量)。由于CriticalSection和Mutex会下

载线程和线程同时工作,影响系统效率,因此这里采用

Semaphore。

信号量的含义:

信号量的特性如下:信号量是一个非负整数(表示可以利用的资源数,

这里指的是可用的数据缓冲区中BLOCK的数量),所有通过它的线

程(线程和线程)都会将该整数减一(通过它当然是为了使

用资源),当该整数值为零时,所有试图通过它的线程都将处于等待

状态。在信号量上我们定义两种操作:Unsignal和Signal(释放)。

当一个线程调用Unsignal操作时,它要么通过然后将信号量减一(还

有相应的资源),要么一直等下去(相应的资源已经没有),直到信

号量大于一或超时。Signal实际上是在信号量上执行加操作,相当于

提醒别的新的线程已经可以使用被释放的资源。

代码见代码1和代码2所示:代码1和代码2是差不多的,

只是注释有所不同,有助于理解。

代码1:

多线程同步的方式有:CriticalSection、Mutex和Semaphore(信号

量)。因为CriticalSection和Mutex,将不会使线程和线程同

时进行工作,影响系统的效率,所以这里采用semaphore。

信号量的含义:

信号量的特性如下:信号量是一个非负整数(表示可以利用的资源数,

这里是指的是可用的数据缓冲区中BLOCK的数量),所有通过它的线

程(线程和线程)都会将该整数减一(通过它当然是为了使用

资源),当该整数值为零时,所有试图通过它的线程都将处于等待状态。在

信号量上我们定义两种操作:Unsignal和Signal(释放)。当一个线

程调用Unsignal操作时,它要么通过然后将信号量减一(还有相应的资

源),要么一直等下去(相应的资源已经没有),直到信号量大于一或超

文档评论(0)

1亿VIP精品文档

相关文档