迅雷面试题:ABCABC… 求pthread_cond_t的解法
题目:
编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
详见:http://blog.csdn.net/enjolras/article/details/7456540
求解答:
1、这道题是否适合使用pthread_cond_t?使用sem_t是否更合适。
2、pthread_cond_signal只能唤醒pthread_cond_wait状态下的线程,为什么linux会这么设计?有什么好处?
[解决办法]
1适合
2没有wait的进程不需要唤醒,这样能提高效率
[解决办法]
加个控制标识就可以了,如果是1A打印,设置为2,如果是2B打印,再设置为3,如果是3C打印,再设置为1.
依次类推。
[解决办法]
搞个线程队列,单向的。比如A执行完了之后加到队列尾部,依次执行。
[解决办法]
你的线程里的处理不对.应该这样
void * thread(thr_id* t){ pthread_mutex_lock(t->mutex); //这个lock相当重要 sem_post(t->sem); pthread_cond_wait(t->self_cond, t->mutex); pthread_mutex_unlock(t->mutex); //真正开始 for(int i = 0; i < 10; ++i) { pthread_mutex_lock(t->mutex); std::cout<<t->id<<std::flush; pthread_cond_signal(t->next_cond); if(i < 9) //输出最后一遍的时候,不用再wait而是退出线程 pthread_cond_wait(t->self_cond, t->mutex); pthread_mutex_unlock(t->mutex); }}
[解决办法]