线程同步的问题,新手勿进!

sand1602 2005-01-01 06:00:21
现在有两个线程,一个用于从文件中读入记录,一个用于向数据库中写入记录,他们共享一个数据,也就是sql字符串。读取线程读入记录后,改写这个sql字符串,然后写入线程执行这个sql字符串,将数据写入,再将sql字符串置为空。现在的问题是怎样确保两个线程同步,不至于在写入线程将数据写入之前,sql字符串已被读入线程更改?

理想的过程是这样的:

//----------------------程序开始-----------------------
Programme Start!
sql字符串 = null;

读取线程.开始();
写入线程.阻塞();
//----------------------程序开始-----------------------

//----------------------读取线程-----------------------
while(true)
{
读取线程.Read();

if(sql字符串 != null)
{
读取线程.阻塞();
}

读取线程.ReWriteSQL();

if(写入线程.阻塞 == true)
{
写入线程.继续执行();
}
}
//----------------------读取线程-----------------------

//----------------------写入线程-----------------------
while(true)
{
if(sql字符串 == null)
{
写入线程.阻塞();
}

写入线程.ReadSQL();
写入线程.重置SQL();

if(读取线程.阻塞 == true)
{
读取线程.继续执行();
}

写入线程.执行SQL();
}
//----------------------写入线程-----------------------
...全文
208 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
phoenixy 2005-05-18
  • 打赏
  • 举报
回复
做个标记
WorldFocus 2005-01-03
  • 打赏
  • 举报
回复
没有细看你的代码,我想这些也许能帮的上忙
signal.WaitOne();signal.Set();
mute.WaitOne();mute.ReleaseMutex();
这些信息够你查帮助得到解决方法了
jianli0108 2005-01-02
  • 打赏
  • 举报
回复
楼主这样发贴,很难有人给你解决的,新人怎么不能进来呢?都是来学习的,别人不是为了你那点分,可笑!
WillSmart 2005-01-02
  • 打赏
  • 举报
回复
写那么多中文也不觉得累吗?感觉在用"易语言".哈哈.
tiger999 2005-01-02
  • 打赏
  • 举报
回复
这么简单的问题,还不让新手进来,新手都会的问题,还放这来问,脸皮真厚
Fibona 2005-01-02
  • 打赏
  • 举报
回复
楼主这样发贴,很难有人给你解决的,新人怎么不能进来呢?都是来学习的,别人不是为了你那点分,可笑!
支持!

楼主的这个问题也好像是很简单的吧
hainang1234 2005-01-02
  • 打赏
  • 举报
回复
楼主叼得很啊!可惜我看不惯你!
ekenlin 2005-01-02
  • 打赏
  • 举报
回复
江南才子
qiuzhongyu 2005-01-02
  • 打赏
  • 举报
回复
MSDN2003 里就有个类似的例子
wl2zw 2005-01-02
  • 打赏
  • 举报
回复
up
egxsun 2005-01-02
  • 打赏
  • 举报
回复
应该不是很难,可以用一布尔值blnRead来判断,在写线程里判断这个值,用Monitor.Wait(this);

public void Read( )
{
lock(this) {
if (!blnRead)//如果现在不可读取
{
try
{

Monitor.Wait(this);
}
catch (SynchronizationLockException e)
{
//Console.WriteLine(e);
}
catch (ThreadInterruptedException e)
{
//Console.WriteLine(e);
}
}
blnRead = false; //重置blnRead标志,表示消费行为已经完成
执行你的工作
Monitor.Pulse(this);
}

public void Write()
{
lock(this)
{
if (blnRead)
{
try
{
Monitor.Wait(this);
}
catch (SynchronizationLockException e)
{
//Console.WriteLine(e);
}
catch (ThreadInterruptedException e)
{
//当线程在等待状态的时候中止
Console.WriteLine(e);
}
}
blnRead = true;
执行你的代码
Monitor.Pulse(this);
}
}
minghui000 2005-01-01
  • 打赏
  • 举报
回复
up
sand1602 2005-01-01
  • 打赏
  • 举报
回复
上面的文字描述有点毛病,更正如下:

现在有两个线程,一个用于从文件中读入记录,一个用于向数据库中写入记录,他们共享一个数据,也就是sql字符串。读取线程读入记录后,改写这个sql字符串,然后写入线程读入sql字符串,并将sql字符串置为空,唤醒阻塞的读入线程(如果读入线程阻塞的话),然后执行sql字符串。现在的问题是怎样确保两个线程同步,不至于在写入线程将数据写入之前,sql字符串已被读入线程更改?

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧