多线程笔试题(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;
}
原文地址:https://www.cnblogs.com/eliu/p/3987244.html