编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
2014-09-18 15:10
1141 查看
编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
首先开辟3个子线程,分别为a,b,c,其中a负责打印'A', b负责打印'B',c负责打印'C'。然后abc开始执行,首先a,b,c都去尝试加锁,其中有一个加锁成功,另外两个则阻塞等待在那里。不妨假设b加锁成功(其实这个可以控制放a先加锁成功);这时a和c线程都阻塞等待加锁,b线程开始执行,当执行到while(param
!= num),因为他的param是1所以!= num(0),所以他会执行下面的条件变量等待语句,于是他暂时释放当前锁,然后等待在条件变量qread之上。因为此时b释放了锁,那么a和c线程就有机会进入循环了。可以发现如果c获得了锁他的状态和b一样都是阻塞在条件变量之上。于是条件变量就有了一个队列:
c b
这时a就可以执行下面的语句了因为在a线程不执行条件变量等待,然后打印出'A',把num置为1,以此可以让b线程执行。然后a线程释放锁,唤醒所有阻塞在条件变量里面的线程(pthread_cond_broadcast(&qready);),然后b和c就都唤醒了。于是再一次去抢占加锁,不妨假设c抢到了锁,然后他再一次被伤害了,因为他需要执行while语句里面的条件变量等待,此时的条件变量将阻塞a和c线程,于是c再一次被阻塞,理所当然的b执行了线程打印出了‘B',后面的故事就一样了。
如此便可以有效的控制线程的输出顺序!
程序中用线程函数func的参数para来判断是打印A或B或C的线程。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
//#define DEBUG 1
#define NUM 3
int n=0;
pthread_mutex_t mutex;
pthread_cond_t cond;
void *func(void * para)
{
int i=0;
for(i=0;i<10;i++)
{
pthread_mutex_lock(&mutex);
while((int)para!=n)
pthread_cond_wait(&cond,&mutex);
printf("%d---%c\n",i,para+'A');
n=(n+1)%3;
pthread_cond_broadcast(&cond);
pthread_mutex_unlock(&mutex);
}
return ((void*)0);
}
int main(int argc, char** argv) {
int i=0,err;
pthread_t tid[NUM];
void *tret;
for(;i<NUM;i++)
{
err=pthread_create(&tid[i],NULL,func,(void *)i);
if(err!=0)
{
printf("thread_create error:%s\n",strerror(err));
exit(-1);
}
}
for (i = 0; i < NUM; i++)
{
err = pthread_join(tid[i], &tret);
if (err != 0)
{
printf("can not join with thread %d:%s\n", i,strerror(err));
exit(-1);
}
}
printf("\n");
return 0;
}
首先开辟3个子线程,分别为a,b,c,其中a负责打印'A', b负责打印'B',c负责打印'C'。然后abc开始执行,首先a,b,c都去尝试加锁,其中有一个加锁成功,另外两个则阻塞等待在那里。不妨假设b加锁成功(其实这个可以控制放a先加锁成功);这时a和c线程都阻塞等待加锁,b线程开始执行,当执行到while(param
!= num),因为他的param是1所以!= num(0),所以他会执行下面的条件变量等待语句,于是他暂时释放当前锁,然后等待在条件变量qread之上。因为此时b释放了锁,那么a和c线程就有机会进入循环了。可以发现如果c获得了锁他的状态和b一样都是阻塞在条件变量之上。于是条件变量就有了一个队列:
c b
这时a就可以执行下面的语句了因为在a线程不执行条件变量等待,然后打印出'A',把num置为1,以此可以让b线程执行。然后a线程释放锁,唤醒所有阻塞在条件变量里面的线程(pthread_cond_broadcast(&qready);),然后b和c就都唤醒了。于是再一次去抢占加锁,不妨假设c抢到了锁,然后他再一次被伤害了,因为他需要执行while语句里面的条件变量等待,此时的条件变量将阻塞a和c线程,于是c再一次被阻塞,理所当然的b执行了线程打印出了‘B',后面的故事就一样了。
如此便可以有效的控制线程的输出顺序!
程序中用线程函数func的参数para来判断是打印A或B或C的线程。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
//#define DEBUG 1
#define NUM 3
int n=0;
pthread_mutex_t mutex;
pthread_cond_t cond;
void *func(void * para)
{
int i=0;
for(i=0;i<10;i++)
{
pthread_mutex_lock(&mutex);
while((int)para!=n)
pthread_cond_wait(&cond,&mutex);
printf("%d---%c\n",i,para+'A');
n=(n+1)%3;
pthread_cond_broadcast(&cond);
pthread_mutex_unlock(&mutex);
}
return ((void*)0);
}
int main(int argc, char** argv) {
int i=0,err;
pthread_t tid[NUM];
void *tret;
for(;i<NUM;i++)
{
err=pthread_create(&tid[i],NULL,func,(void *)i);
if(err!=0)
{
printf("thread_create error:%s\n",strerror(err));
exit(-1);
}
}
for (i = 0; i < NUM; i++)
{
err = pthread_join(tid[i], &tret);
if (err != 0)
{
printf("can not join with thread %d:%s\n", i,strerror(err));
exit(-1);
}
}
printf("\n");
return 0;
}
相关文章推荐
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 第四题(迅雷笔试题):编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 笔试题:编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC
- 开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 润和面试题:开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推:
- 编写一个程序,开启 3 个线程,这三个线程的 ID 分别为 A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。如:ABCABCABC…… 依次递归
- 开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上,要求输出结果必须按ABC的顺序显示:ABCABC
- 开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上,要求输出结果必须按ABC的顺序显示:ABCABC【转载】