Linux多线程面试题

前面的选择题那些跳过,直接看最后的编程题。

第三题(某培训机构的练习题):

子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次,试写出代码。

第四题(迅雷笔试题):

编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。

第五题(Google面试题)

有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD。初始都为空。现要让四个文件呈如下格式:

A:1 2 3 4 1 2....

B:2 3 4 1 2 3....

C:3 4 1 2 3 4....

D:4 1 2 3 4 1....

请设计程序。


第六题

生产者消费者问题

这是一个非常经典的多线程题目,题目大意如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,所有生产者和消费者都是异步方式运行的,但它们必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经装满产品且尚未被取走的缓冲区中投放产品。

第七题

读者写者问题

这也是一个非常经典的多线程题目,题目大意如下:有一个写者很多读者,多个读者可以同时读文件,但写者在写文件时不允许有读者在读文件,同样有读者读时写者也不能写。

第三题、第四题、第五题第一反应用条件变量来实现。第六题和第七题用读写锁来实现。

第三题、第四题、第五题和我这篇linux多线程学习 (见 http://www.linuxidc.com/Linux/2012-05/60858.htm ) 举得那例子很相似,只需要少量修改就能完成要求。不多说,直接上代码。


第四题代码:
  1. #include <stdio.h>   
  2. #include <stdlib.h>   
  3. #include <pthread.h>   
  4. #include <unistd.h>   
  5. #include <string.h>   
  6. //#define DEBUG 1   
  7. #define NUM 3   
  8.   
  9. int n=0;  
  10. pthread_mutex_t mylock=PTHREAD_MUTEX_INITIALIZER;  
  11. pthread_cond_t qready=PTHREAD_COND_INITIALIZER;  
  12. void * thread_func(void *arg)  
  13. {  
  14.     int param=(int)arg;  
  15.     char c='A'+param;  
  16.     int ret,i=0;  
  17.     for (; i < 10; i++)  
  18.     {  
  19.         pthread_mutex_lock(&mylock);  
  20.         while (param != n)  
  21.         {  
  22. #ifdef DEBUG   
  23.             printf("thread %d waiting\n", param);  
  24. #endif   
  25.             ret = pthread_cond_wait(&qready, &mylock);  
  26.             if (ret == 0)   
  27.             {  
  28. #ifdef DEBUG   
  29.                 printf("thread %d wait success\n", param);  
  30. #endif   
  31.             } else   
  32.             {  
  33. #ifdef DEBUG   
  34.                 printf("thread %d wait failed:%s\n", param, strerror(ret));  
  35. #endif   
  36.             }  
  37.         }  
  38.        // printf("%d ",param+1);   
  39.         printf("%c ",c);  
  40.         n=(n+1)%NUM;  
  41.         pthread_mutex_unlock(&mylock);  
  42.         pthread_cond_broadcast(&qready);  
  43.     }      
  44.     return (void *)0;  
  45. }  
  46. int main(int argc, char** argv) {  
  47.       
  48.     int i=0,err;  
  49.     pthread_t tid[NUM];  
  50.     void *tret;  
  51.     for(;i<NUM;i++)  
  52.     {  
  53.         err=pthread_create(&tid[i],NULL,thread_func,(void *)i);  
  54.         if(err!=0)  
  55.         {  
  56.             printf("thread_create error:%s\n",strerror(err));  
  57.             exit(-1);  
  58.         }  
  59.     }  
  60.     for (i = 0; i < NUM; i++)  
  61.     {  
  62.         err = pthread_join(tid[i], &tret);  
  63.         if (err != 0)  
  64.         {  
  65.             printf("can not join with thread %d:%s\n", i,strerror(err));  
  66.             exit(-1);  
  67.         }  
  68.     }  
  69.     printf("\n");  
  70.     return 0;  
  71. }  
运行结果:


第五题:

选项A,代码只需要将NUM改为4,printf("%c ",c)改为printf("%d ",param+1);即可

执行结果如下:


选项B,将全局变量n改为1


选项C,将全局变量n改为2


选项D,将全局变量n改为3


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值