线程中sleep怎么会影响到主程序sleep呢???

WANGyiping080815 2011-04-01 12:42:40
我是这样用的:

void JudegAlert(void *)
{
....
sleep(50);
}
int main()
{
......
pthread_create(&pthrd, NULL, JudegAlert, NULL);//这里创建一个线程
.....
while(1)
{
epoll_wait (kdpfd, events, curfds, 100);
.....
accept (listener, (struct sockaddr *) &their_addr, &len);
//下面就是解析数据了
.....
}
}

本来我的意思是:创建一个线程,线程是每隔50秒就检查一遍数据库等,然后主程序一直是等待数据读取过来,
现在我发现,主程序也在sleep,不知道为啥? 当时测试的时候是这样的,就是有一个客户端是每隔50秒给我发送一次数据,数据中有2个包,
然后我看了下我的程序,我好像在我只能一次接收2个包,如果还有的话就又要等50秒了,一次只能是2个包??? 还要等50秒,这是为啥呢???
...全文
980 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2011-07-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 meteor_code 的回复:]

用这个吧,我多年前写的,可以线程沉睡,编译开关lz能明白吧,你可以自己去掉
void thread_sleep(unsigned long sleepSecond)
{
#if (APP_USE_SYS == APP_SYS_LINUX)
timeval t_timeval;
t_timeval.tv_sec = (sleepSecond / 1000);
t……
[/Quote]

同意这种办法。
WANGyiping080815 2011-04-12
  • 打赏
  • 举报
回复
唉, 还是没有解决,有时会快,有时会慢,待处理中。。。
wyfwx 2011-04-02
  • 打赏
  • 举报
回复
可以肯定与void JudegAlert(void *)
的延时无关
nilite 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 meteor_code 的回复:]
引用 20 楼 nilite 的回复:
sleep() makes the calling process sleep until seconds seconds have elapsed or a signal arrives which is not ignored.

的确清楚
process:意思就是进程
thread:才是线程
fedora8下测试过很多次,sleep的确造成……
[/Quote]

如果线程的阻塞会互相影响的话,那线程的存在就没有任何意义了,线程本来就是为并发执行创造的。只有信号处理函数会阻塞所有的线程。在Linux内核的进程调度中,调度的对象是线程,换句话说,每个线程其实都是作为一个进程在运行的。

关于POSIX线程的更多信息,你可以参考以下地址:
https://computing.llnl.gov/tutorials/pthreads/#Thread
bcj00000 2011-04-02
  • 打赏
  • 举报
回复
是epoll 出问题了, LT or GT

不是sleep 问题

接分小王
leihelin5201314 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zhao4zhong1 的回复:]

不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
[/Quote]呵呵,想起了我以前,
LZ,我的linux下的sleep是秒,不是毫秒···
Meteor_Code 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 nilite 的回复:]
sleep() makes the calling process sleep until seconds seconds have elapsed or a signal arrives which is not ignored.
[/Quote]
的确清楚
process:意思就是进程
thread:才是线程
fedora8下测试过很多次,sleep的确造成了整个进程的阻塞
lz的例子也很明确证明了这一点
另外,的确,linux下sleep的单位参数是秒,这个我不否定
nilite 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 meteor_code 的回复:]
我的函数参数单位是毫秒(1/1000)秒,不是秒,lz注意,另外,linux下sleep的参数单位也是毫秒
[/Quote]

这个说法也是错误的,sleep的参数单位是秒,你是用哪个山寨版本的linux的?
nilite 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 meteor_code 的回复:]
引用 16 楼 nilite 的回复:

引用 3 楼 meteor_code 的回复:
linux 的sleep是进程沉睡


这个说法完全错误,在一个线程中睡眠,不会影响另外一个线程。

自己看sleep的文档说明,自己测试,不要和我说一个线程阻塞会不会引起其他线程的阻塞
现在我说的是sleep的功能就是整个进程沉睡
[/Quote]


虽然man手册上面写着“sleep() makes the calling process sleep until seconds seconds have elapsed or a signal arrives which is not ignored.” 但是实际上,sleep只会阻塞当前线程,不会对其他线程造成任何影响。你竟然还懂得测试这个道理,那为什么不自己去测试?我已经做了上百次的测试了。
Meteor_Code 2011-04-01
  • 打赏
  • 举报
回复
我的函数参数单位是毫秒(1/1000)秒,不是秒,lz注意,另外,linux下sleep的参数单位也是毫秒
Meteor_Code 2011-04-01
  • 打赏
  • 举报
回复
用这个吧,我多年前写的,可以线程沉睡,编译开关lz能明白吧,你可以自己去掉
void thread_sleep(unsigned long sleepSecond)
{
#if (APP_USE_SYS == APP_SYS_LINUX)
timeval t_timeval;
t_timeval.tv_sec = (sleepSecond / 1000);
t_timeval.tv_usec = (sleepSecond % 1000);
select(0, NULL, NULL, NULL, &t_timeval);
#else
Sleep(sleepSecond);
#endif
return;
}
Meteor_Code 2011-04-01
  • 打赏
  • 举报
回复
linux 的sleep是进程沉睡
nfer_cn 2011-04-01
  • 打赏
  • 举报
回复
问题应该出在epoll_wait上
你看看你的线程中sleep的时候有没有释放 events
bdmh 2011-04-01
  • 打赏
  • 举报
回复
你的接收,是不是阻塞式的
zhao_rengang 2011-04-01
  • 打赏
  • 举报
回复
你使用的epoll边缘触发模式,另外你是非阻塞,你查查recv_message,是不是把数据读完了
另外Meteor_Code说的情况,我觉得你这里不是那种情况
hukui161 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zhao4zhong1 的回复:]
不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
[/Quote]学习。
Meteor_Code 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 nilite 的回复:]

引用 3 楼 meteor_code 的回复:
linux 的sleep是进程沉睡


这个说法完全错误,在一个线程中睡眠,不会影响另外一个线程。
[/Quote]
自己看sleep的文档说明,自己测试,不要和我说一个线程阻塞会不会引起其他线程的阻塞
现在我说的是sleep的功能就是整个进程沉睡
nilite 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 meteor_code 的回复:]
linux 的sleep是进程沉睡
[/Quote]

这个说法完全错误,在一个线程中睡眠,不会影响另外一个线程。
luciferisnotsatan 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zhao4zhong1 的回复:]

不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
[/Quote]
顶一个。
赵4老师 2011-04-01
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
加载更多回复(8)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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