带两个索引的循环缓冲区

时间:2015-09-16 13:27:14

标签: c# multithreading circular-buffer

我想制作一个循环缓冲区,它有两个索引:

  • WriteIndex(由第一个线程控制)在缓冲区中写入新值
  • ReadIndex(由第二个线程控制)从缓冲区读取值并进行分析

那么,当两个索引处于相同位置时,如何暂停Thread。 我的意思是,如果你没有写任何新数据,你就无法读取它,所以如果writeindex和readindex位于同一位置,你只需要编写新数据,而不是读取它。

如何阻止线程直到发生某些事情?

1 个答案:

答案 0 :(得分:5)

您正在寻找的内容已经在BCL中:BlockingCollection<T>

它是线程安全的:它有一个Add() method来添加项目和一个阻塞Take() method阻塞(“暂停调用线程”)直到一个项目可用。

正如现在删除的评论中所提到的:这确实不是真正的循环缓冲区,一旦达到最大值就处理或覆盖项目。您可以设置集合大小的上限;这会使if (isset($_POST['update'])){ $UpdateQuery = "UPDATE eventcalendar SET Title='$_POST[title]', Detail='$_POST[detail]' WHERE ID='$_GET[ID]'"; mysql_query($UpdateQuery, $con); } $sql = "SELECT * FROM eventcalendar"; $myData = mysql_query($sql,$con); echo "<table border=1'> <tr> <th>Id</th> <th>Title</th> <th>Detail</th> <th>Event Date</th> <th>Date Added</th> </tr>"; while($row = mysql_fetch_array($myData)){ echo "<form action=details.php method=post>"; echo "<tr>"; echo "<td>" . $row['ID'] . "</td>"; echo "<td>" . "<input type=text name=title value=" . $row['Title'] . " </td>"; echo "<td>" . "<input type=text name=detail value=" . $row['Detail'] . " </td>"; echo "<td>" . $row['eventDate'] . "</td>"; echo "<td>" . $row['dateAdded'] . "</td>"; echo "<td>" . "<input type=submit name=update value=update" . " </td>"; echo "</tr>"; echo "</form>"; } echo "</table>"; mysql_close($con); 阻塞,直到有更多空间。