当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 13 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [问题]一个线程初级问题
帖子发表于 : 2008-08-10 19:17 
头像

注册: 2005-08-17 19:20
帖子: 662
送出感谢: 0 次
接收感谢: 0 次
在C程序中第一次使两个线程对同一个变量操作,看下这样用是否有问题,会不会产生混乱:

int g_num = 0;

线程1:
{
while(1)
{
if(g_num <= 15)
{
g_num++;
}
sleep(1);
}
}

主程序:
{
……
……
if(g_num >= 15)
{
g_num = 0;
}
}


_________________
生如夏花之绚丽,死如秋叶之静美


最后由 Roots 编辑于 2008-08-10 19:36,总共编辑了 1 次

页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2008-08-10 19:19 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
会的


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2008-08-10 19:39 
头像

注册: 2005-08-17 19:20
帖子: 662
送出感谢: 0 次
接收感谢: 0 次
详细点撒,
g_num起一个标志的作用,线程1计数,主进程来判断处理


_________________
生如夏花之绚丽,死如秋叶之静美


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2008-08-10 19:49 
头像

注册: 2007-03-13 11:23
帖子: 1343
送出感谢: 0 次
接收感谢: 0 次
怎么能这么写多线程.线程1和主线程的操作是atom操作么?


_________________
"We are all in the mud, but some of us are looking at the stars." (Oscar Wilde)
We are not born for ourselves.
人生天地间,并非为自己
Homepage:http://sites.google.com/site/polarisnotme/


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2008-08-10 19:57 
头像

注册: 2005-08-17 19:20
帖子: 662
送出感谢: 0 次
接收感谢: 0 次
不是很懂俄,
线程有线程1其实主要是敢干的事,定时每秒一次,因为主程序要用到一个时间判断,为方便所以把这个加线程里了


_________________
生如夏花之绚丽,死如秋叶之静美


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2008-08-10 20:00 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
Roots 写道:
不是很懂俄,
线程有线程1其实主要是敢干的事,定时每秒一次,因为主程序要用到一个时间判断,为方便所以把这个加线程里了


多线程操作共享对象很易出问题的
例如

代码:
if(g_num <= 15)
{
# 另一个线程在这时 g_num++ ...
g_num++;
}


另外 g_num++ 是不是原子性也是个问题..


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2008-08-10 20:03 
头像

注册: 2007-03-13 11:23
帖子: 1343
送出感谢: 0 次
接收感谢: 0 次
下面给你贴的是Netscape的代码
代码:
165 PRInt32
166 _PR_MD_ATOMIC_INCREMENT(PRInt32 *val)
167 {
168     PRInt32 rv;
169     PRInt32 idx = _PR_HASH_FOR_LOCK(val);
170
171     pthread_mutex_lock(&atomic_locks[idx]);
172     rv = ++(*val);
173 #ifdef DEBUG
174     hash_lock_counts[idx]++;
175 #endif
176     pthread_mutex_unlock(&atomic_locks[idx]);
177     return rv;
178 }


为什么人家不和你一样直接
xxx++了事.
你贴的代码问题很多.
------------------------------------------------------------------
当然人人家的代码是为了跨平台,这样的实现不是很高效


_________________
"We are all in the mud, but some of us are looking at the stars." (Oscar Wilde)
We are not born for ourselves.
人生天地间,并非为自己
Homepage:http://sites.google.com/site/polarisnotme/


页首
 用户资料  
 
8 楼 
 文章标题 :
帖子发表于 : 2008-08-10 20:19 
头像

注册: 2005-08-17 19:20
帖子: 662
送出感谢: 0 次
接收感谢: 0 次
看来还是要锁一下,我就怕出现缩死现象

我是怕内存出错,其实那个时间标志的准确性不是很重要,只是根据情况估测了一个值,主程序的清0操作在前一次还是后一次,不是很重要


_________________
生如夏花之绚丽,死如秋叶之静美


页首
 用户资料  
 
9 楼 
 文章标题 :
帖子发表于 : 2008-08-10 20:29 
头像

注册: 2007-03-13 11:23
帖子: 1343
送出感谢: 0 次
接收感谢: 0 次
小心循环锁


_________________
"We are all in the mud, but some of us are looking at the stars." (Oscar Wilde)
We are not born for ourselves.
人生天地间,并非为自己
Homepage:http://sites.google.com/site/polarisnotme/


页首
 用户资料  
 
10 楼 
 文章标题 :
帖子发表于 : 2008-08-11 22:29 

注册: 2006-09-11 22:47
帖子: 2841
送出感谢: 0 次
接收感谢: 4
你这个地方,因为只有一个线程进行写操作,不锁是没有问题的。虽然++不是原子操作但对此没有影响。

不过因为你一边用 >= 15, 另一边用 <= 15,导致了实际运行结果的不确定(15还是16次,都有可能)。也许你可以无所谓一个tick的sleep,但是这种散漫的编程习惯似乎很有问题。


页首
 用户资料  
 
11 楼 
 文章标题 :
帖子发表于 : 2008-08-11 22:33 
头像

注册: 2007-02-18 19:33
帖子: 2180
地址: lyric.im
系统: OSX
送出感谢: 0 次
接收感谢: 1
锁.....


_________________
既然你诚心诚意地问了
我就大慈大悲地告诉你
为了防止世界被破坏
为了维护世界的和平
贯彻爱与真实的罪恶
可爱而又迷人的反派角色
武藏,小次郎
我们是穿越银河的火箭队,白洞白色的明天在等着我们。就是这样!!喵~~


页首
 用户资料  
 
12 楼 
 文章标题 :
帖子发表于 : 2008-08-11 23:14 
头像

注册: 2007-03-13 11:23
帖子: 1343
送出感谢: 0 次
接收感谢: 0 次
poet 写道:
你这个地方,因为只有一个线程进行写操作,不锁是没有问题的。虽然++不是原子操作但对此没有影响。

不过因为你一边用 >= 15, 另一边用 <= 15,导致了实际运行结果的不确定(15还是16次,都有可能)。也许你可以无所谓一个tick的sleep,但是这种散漫的编程习惯似乎很有问题。

我也认为这个编码风格不行


_________________
"We are all in the mud, but some of us are looking at the stars." (Oscar Wilde)
We are not born for ourselves.
人生天地间,并非为自己
Homepage:http://sites.google.com/site/polarisnotme/


页首
 用户资料  
 
13 楼 
 文章标题 :
帖子发表于 : 2008-08-12 19:09 
头像

注册: 2005-08-17 19:20
帖子: 662
送出感谢: 0 次
接收感谢: 0 次
“一边用 >= 15, 另一边用 <= 15”,这个其实是有意为之,保险一下。

只有一个线程进行写操作?
g_num++;
g_num = 0;
哪个不算?


_________________
生如夏花之绚丽,死如秋叶之静美


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 13 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 4 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译