• 多线程笔试题(linux)


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

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <pthread.h>
    pthread_attr_t  attr;
    pthread_mutex_t  mutex;
    pthread_cond_t cond;
    
    pthread_t pid;
    
    int  flag1 = 0, flag2 = 0;
    void *func(void *arg) {
     int i, k = 0;
     while( 1) {
      for(i = 1; i <= 10; i++ ) 
       printf("%d ", i);
      printf("
    ");
      pthread_mutex_lock(&mutex);
      flag2 = 1;
      pthread_cond_signal(&cond);
      while(flag1 != 1) {
       pthread_cond_wait(&cond, &mutex);
      }
      flag1 = 0;
      pthread_mutex_unlock(&mutex);
      k++;
      if(k ==4)
       pthread_exit(NULL);
     }
    }
    int main() {
     int i, k = 0;
     pthread_mutex_init(&mutex, NULL);
     pthread_cond_init(&cond, NULL);
     pthread_attr_init( &attr);                      /*属性*/
         pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_DETACHED);
     pthread_create(&pid, &attr, func, NULL );
     while(1) {
      pthread_mutex_lock(&mutex);
      
      while(flag2 != 1) {
      
       pthread_cond_wait(&cond, &mutex);
      }
      flag2 = 0;
      for(i = 0; i < 100; i++) {
       printf("%d ",i+1);
      }
      printf("
    ");
      flag1 = 1;
      pthread_cond_signal(&cond);
      pthread_mutex_unlock(&mutex);
     
      k++;
      if(k == 4) {
       /*pthread_cancel(pid);
       sleep(1);*/
       exit(0);
      }
     }
     exit(0);
    }
     

    问题在于pthread_cond_signal时,接收线程必须准备好。这让3个线程搅在一起,果断弄晕了。

    算了,还是用匿名信号灯,不过我想考这题的初衷是考互斥锁加条件吧。 

    (迅雷笔试题):

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

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <pthread.h>
    //#include "unpipc.h"
    #include <semaphore.h>
    pthread_t  pidA, pidB, pidC;
    pthread_attr_t  attr;
    sem_t semA, semB, semC;
    
    void *funcA(void *arg);
    void *funcB(void *arg);
    void *funcC(void *arg);
    int main( ) {
     int  i;
     //pthread_attr_init( &attr);                      /*属性*/
         //pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_DETACHED);
    
     sem_init(&semA, 0, 1);
     sem_init(&semB, 0, 0);
     sem_init(&semC, 0, 0);
     pthread_create(&pidA, &attr, funcA, (void *)&pidA );
     pthread_create(&pidB, &attr, funcB, (void *)&pidB );
     pthread_create(&pidC, &attr, funcC, (void *)&pidC );
     pthread_join(pidA, NULL);
     pthread_join(pidB, NULL);
     pthread_join(pidC, NULL);
     sem_destroy(&semA);
     sem_destroy(&semB);
     sem_destroy(&semC);
     exit(0);
    }
    void *funcA(void *arg) {
     long  pid = *(long *)arg;
     int   i;
     for(i = 0; i< 10; i++){
      sem_wait(&semA);
      printf("A"); /*printf("%ld ", pid);*/
      fflush(stdout);
      sem_post(&semB);
     }
     return NULL;
    }
    void *funcB(void *arg) {
     long  pid = *(long *)arg;
     int   i;
     for(i = 0; i< 10; i++){
      sem_wait(&semB);
      printf("B", i);/*printf("%ld ", pid);*/
      fflush(stdout);
      sem_post(&semC);
     }
     return NULL;
    }
    void *funcC(void *arg) {
     long  pid = *(long *)arg;
     int   i;
     for(i = 0; i< 10; i++){
      sem_wait(&semC);
      printf("C");/*printf("%ld ", pid);*/
      fflush(stdout);
      sem_post(&semA);
     }
     return NULL;
    }
  • 相关阅读:
    VS2013安装与部署工具中添加 vcredist_x64.exe
    ZeroMQ高水位标记(high-water mark,HWM)
    Ubuntu16.04 动态链接库(.so)查询路径设置
    ubuntu16.04开机启动字符界面
    python 全局搜索路径
    learning to rank
    数据集
    hadoop streaming 文档
    机器学习:一些感想
    矩阵分解 推荐
  • 原文地址:https://www.cnblogs.com/eliu/p/3987244.html
Copyright © 2020-2023  润新知