再加100分..请教Pthread的问题

danny 2009-11-26 02:36:45
原贴在这里 http://topic.csdn.net/u/20091125/18/c4d2e9b1-f2de-4957-adf6-4db810bd7fd2.html


我把所有的代码贴到了我的blog上,http://blog.csdn.net/wheresky/archive/2009/11/26/4877823.aspx

麻烦大家帮帮忙...

这个东西弄好了,可以很方便地当定时器用的..目标就是这个.
...全文
175 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
hyanq 2011-07-05
  • 打赏
  • 举报
回复
关注中....
danny 2009-12-07
  • 打赏
  • 举报
回复
程序上基本上写得没问题..

虚拟机貌似有问题..别人给的..

板子上运行正常,另一台自己装的ubuntu8.04虚拟机运行也正常...

明天结贴。。

想接分的赶快了。。
jiangfeng999 2009-12-04
  • 打赏
  • 举报
回复
还有你的这个类里面存在着孙线程的现象
int main(int argc, char** argv)
{
LinuxThread *m_th1 = new LinuxThread;
char temp[] = "hello wordl!";
m_th1->Set(fun1, temp, 1100);
m_th1->Start();
。。。。
}
调用了Start函数,产生了一个线程;
调用Stop函数时,stop函数内部调用了WorkNow();
WorkNow();函数内部又调用了一次Start,又创建了一个线程。

关系好复杂,不知道楼主这样写要实现什么功能
jiangfeng999 2009-12-04
  • 打赏
  • 举报
回复
你的metux不能在线程类里面声明和初始化,因为metux是要来控制线程间的同步问题的。应该独立在线程类之外
jiangfeng999 2009-12-02
  • 打赏
  • 举报
回复
把你的调用这些类的方式也发给我一下,我一起测测
wangqingshui531 2009-12-02
  • 打赏
  • 举报
回复
关注中....
danny 2009-12-02
  • 打赏
  • 举报
回复
to MSDA
我在那个工作线程中,有加锁的。也按你的测了一下,貌似还是有问题.好郁闷.
你如果测试好了,能把修改后的代码再用mail回给我嘛,谢谢了。

to zhuxueling
单个的先弄正常,然后再管理吧..

to hairetz
我下了这个测试程序,加上del等测试代码,直接make后,执行,正常的不得了..

但因为我是C++环境,我把代码放到了用NetBeans开的C++的工程里,头文件和源文件都没动,是以extern的方式引用...test.c的内容复制到了main.cpp,编译运行问题就又出现了,再del_timer的时候..卡住了....试了好几遍.. C++和C环境有需要注意的地方嘛??

zhuxueling 2009-12-01
  • 打赏
  • 举报
回复
如果你仅仅为了每隔一段时间,运行一个函数,你走错路了。。。
换一种方法,你能实现一个更好的作业管理系统,而且可以做到同时管理多个任务。
比如每隔1秒发送心跳包,每隔1分钟更新数据库,每隔5分钟把信息写入磁盘等等,
可以在任意时候加入或是删除一个作业。。。
  • 打赏
  • 举报
回复
XyRbj 2009-12-01
  • 打赏
  • 举报
回复
mark
jiangfeng999 2009-11-30
  • 打赏
  • 举报
回复
看了一下代码,发现楼主没有在thread_cond_wait之前对变量进行锁定

我修改了一下代码:

typedef bool testCondition();//测试条件分支是否满足的指针
void Condition::wait(pthread_mutex_t *lock,testCondition *pFunction)
{
pthread_mutex_lock(lock);
while(testCondition!=true)
pthread_cond_wait((pthread_cond_t*) cond, lock);
pthread_mutex_unlock(lock);
}
danny 2009-11-26
  • 打赏
  • 举报
回复
嗯嗯,wenxy1你说的我明白...

我的代码里应该也是这样实现的啊.

to msdn:
代码我发过去了...可能要取掉mutex类初始化时的属性设置..
Wenxy1 2009-11-26
  • 打赏
  • 举报
回复
不论哪种等待方式,都必须和一个互斥锁配合,以防止多个线程同时请求pthread_cond_wait()(或 pthread_cond_timedwait(),下同)的竞争条件(Race Condition)。mutex互斥锁必须是普通锁(PTHREAD_MUTEX_TIMED_NP)或者适应锁(PTHREAD_MUTEX_ADAPTIVE_NP),且在调用pthread_cond_wait()前必须由本线程加锁(pthread_mutex_lock()),而在更新条件等待队列以前,mutex保持锁定状态,并在线程挂起进入等待前解锁。在条件满足从而离开 pthread_cond_wait()之前,mutex将被重新加锁,以与进入pthread_cond_wait()前的加锁动作对应。
Wenxy1 2009-11-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wheresky 的回复:]
看了下给的三楼的连接,然后把mutex的属性为空.
原来的是在mutex类初始化时加了个可以递归加锁的属性..

但是问题依然存在..

每次在主线程中调用stop时,执行到signal唤醒线程时,好像就产生死锁了。。
有文章也会说条件变量机制不是异步信号安全的,也就是说,在信号处理函数中调用pthread_cond_signal()或者pthread_cond_broadcast()很可能引起死锁。


这个怎么避免貌似没有怎么看懂...
[/Quote]

mutex 与 条件变量一起用,来防止产生竞争条件而死锁。
jiangfeng999 2009-11-26
  • 打赏
  • 举报
回复
发一份到我qq邮箱,帮你看看
41031962@qq.com
danny 2009-11-26
  • 打赏
  • 举报
回复
看了下给的三楼的连接,然后把mutex的属性为空.
原来的是在mutex类初始化时加了个可以递归加锁的属性..

但是问题依然存在..

每次在主线程中调用stop时,执行到signal唤醒线程时,好像就产生死锁了。。
有文章也会说条件变量机制不是异步信号安全的,也就是说,在信号处理函数中调用pthread_cond_signal()或者pthread_cond_broadcast()很可能引起死锁。


这个怎么避免貌似没有怎么看懂...
kooko1986 2009-11-26
  • 打赏
  • 举报
回复
 加油
danny 2009-11-26
  • 打赏
  • 举报
回复
已经精简了很多了...

昨天看了好久了...最后实在是搞不定了才问的..

Caballeroo 2009-11-26
  • 打赏
  • 举报
回复
看了你的,单步调试正常,而多个线程一起运行会出现有线程挂起的话,那肯定是出现线程死锁了!

你的互斥量以及条件变量使用的太多,而且很混乱,你自己都没有完全理解,先把这些精简一下。

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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