一个关于多线程和lock的问题

chenguang79 2011-09-13 04:48:47
我用多线程来读取一个数组中的数据,因为怕读重了,加了一个锁,可是感觉加上锁以后,和单线程没有分别了,下面我把代码放出来,兄弟们给看一下。
 static object obj = new object();

static int num = 0;

static void Main(string[] args)
{
Program p = new Program();


string strTemp = "第一,第二,第三,第四,第五,第六";

string[] ArrayTemp = strTemp.Split(new string[] { "," }, StringSplitOptions.None);

num = ArrayTemp.Length;


Thread thread1 = new Thread(new ThreadStart(p.GetNum));
thread1.Name = "第一线程";
thread1.Priority = ThreadPriority.Highest;
Thread thread2 = new Thread(new ThreadStart(p.GetNum));
thread2.Name = "第二线程";
thread2.Priority = ThreadPriority.Lowest;

thread1.Start();
thread2.Start();



Console.ReadKey();
}


public void GetNum()
{

//lock (obj)
//{
string strTemp = "第一,第二,第三,第四,第五,第六";

string[] ArrayTemp = strTemp.Split(new string[] { "," }, StringSplitOptions.None);



while (true)
{
if (num >= 1)
{
lock (this)
{
Console.WriteLine(Thread.CurrentThread.Name + ArrayTemp[num - 1].ToString());

Thread.Sleep(2000);

num--;

if (num <= 1)
break;
}
}


}

//}

}
...全文
114 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
逐风 2011-09-16
  • 打赏
  • 举报
回复
lock 简单说明
当多个线程都需要改变一个对象的时候,防止其他线程越界。
简单的说,比如你需要把一个数组的 0 位 改变,
如果你不lock,
可能在修改的时候,其他线程已经改变该值,这样造成错误。

简单的说,lock 只是保证一个对象只有你一个人在修改。
cuiweibin5 2011-09-16
  • 打赏
  • 举报
回复
funxu
顶你
ajaxtop 2011-09-14
  • 打赏
  • 举报
回复
多线程学习……
chenguang79 2011-09-14
  • 打赏
  • 举报
回复
顶上去。。。。
  • 打赏
  • 举报
回复
老鼠爱上猫 2011-09-13
  • 打赏
  • 举报
回复
关注,学习..........
TMajier 2011-09-13
  • 打赏
  • 举报
回复
你这种方法是做不到同步的!你试着换一种思路!让线程一输出元素1、2、3;让线程二输出元素4,5,6!
两个线程同步运行,这样能节省时间!然后设置每个线程的AutoResetEvent。等所有的线程输出完毕再执行主线程!
http://hi.baidu.com/mlh2/blog/item/d5c995f4d395d868dcc4747d.html
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 chenguang79 的回复:]
其实,这只是我写的一个例子,因为我要做的是,从数据库中取出一部分数据存入datatable中。然后多线程的输出给另一个平台。
[/Quote]

控制一下行索引应该就可以了
chenguang79 2011-09-13
  • 打赏
  • 举报
回复
其实,这只是我写的一个例子,因为我要做的是,从数据库中取出一部分数据存入datatable中。然后多线程的输出给另一个平台。
chenguang79 2011-09-13
  • 打赏
  • 举报
回复
如果不加lock的话,一运行,第一,二线程都会输出 第六,结束的时候,没有第一
我的意思其实很简单,就是想让这二个线程,交替来读出数据,这样不是可以快一点吗。
如:
第一线程  第六
第二线程  第五
第一线程  第四

这样的。。。
TMajier 2011-09-13
  • 打赏
  • 举报
回复
你现在应该还是能读重的!
不读重的话,lock应该是加在你注释掉的地方或者是while(true)的后面!
跟单线程还是有区别的。在输出的过程中,有可能是线程一输出,也有可能是线程二输出!
funxu 2011-09-13
  • 打赏
  • 举报
回复
这样改看看
bool needexit=false;
private object b = new object();
lock (b)
{
Console.WriteLine(Thread.CurrentThread.Name + ArrayTemp[num - 1].ToString());
num--;
if (num <= 1)
needexit=true;
}
Thread.Sleep(2000);
if (needexit==true)
break;
bdmh 2011-09-13
  • 打赏
  • 举报
回复
纯粹的数字加减,这样来否定线程?每个线程负责一部分范围,不是从头至尾
  • 打赏
  • 举报
回复
不明白楼主想说什么
funxu 2011-09-13
  • 打赏
  • 举报
回复
多线程除非你的共享数据会改变,否则没必要加锁的
如果你想让两个线程读取不同的内容,直接把num 设成共享变量,然后对他加锁就行了
而且也不要lock(this)
private object b = new object();
lock (b)
{
num--;
}
funxu 2011-09-13
  • 打赏
  • 举报
回复
就你的代码看是不需要加锁的啊

110,533

社区成员

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

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

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