多线程笔试题(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("\n");
  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("\n");
  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;
}
时间: 2024-10-29 19:13:30

多线程笔试题(linux)的相关文章

从网易的一道多线程笔试题学习wait与notify来控制线程同步

题目 : 有三个线程分别打印A.B.C,请用多线程编程实现,在屏幕上循环打印10次ABCABC… package my.thread.test; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class PrintThreadExample { public static void main(String[] args) { PrintThreadExample

java多线程笔试题---所有线程func1()执行完了,再执行func2()的实现

1.问题描述: 某个类有2个方法func1(),func2(),有threadCount个线程,要求所有线程执行完func1(),再执行func2(). 2.分析: 1)所有线程的func1()执行完的标准是什么? 2)线程之间怎样共享变量? 3.代码实现 1)源代码: /** * */ package com.sunny.www.interview; import java.util.concurrent.atomic.AtomicInteger; /** * 所有线程执行完方法1,再执行方法

嵌入式Linux C笔试题积累(转)

http://blog.csdn.net/h_armony/article/details/6764811 1.   嵌入式系统中断服务子程序(ISR) 中断是嵌入式系统中重要的组成部分,这导致了很 多编译开发商提供一种扩展—让标准C支持中断.具代表事实是,产生了一个新的关键字 __interrupt.下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的. __interrupt double compute_area (double radi

嵌入式Linux C笔试题积累

1.   嵌入式系统中断服务子程序(ISR) 中断是嵌入式系统中重要的组成部分,这导致了很 多编译开发商提供一种扩展—让标准C支持中断.具代表事实是,产生了一个新的关键字 __interrupt.下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的. __interrupt double compute_area (double radius) { double area = PI * radius * radius; printf(" Are

老男孩教育-linux面试题-笔试题-1

2. 笔试题-1 2.1 新建一个用户user,密码是123456,并将其加到root组 useradd user -G root && echo "123456"|passwd --stdin user 2.2 显示当前系统的日期和时间 [[email protected] /]# date +%F 2016-08-25 [[email protected] /]# date +%X 10时16分25秒 [[email protected] /]# date +%H:

100 道 Linux 笔试题,能拿 80 分就算大神!

本套笔试题共100题,每题1分,共100分.(参考答案在文章末尾) 1. cron 后台常驻程序 (daemon) 用于: A. 负责文件在网络中的共享 B. 管理打印子系统C. 跟踪管理系统信息和错误 D. 管理系统日常任务的调度 2. 在大多数Linux发行版本中,以下哪个属于块设备 (block devices) ? A. 串行口B. 硬盘 C. 虚拟终端D. 打印机 3. 下面哪个Linux命令可以一次显示一页内容? A. pause B. cat C. more D. grep 4. 

非常全的linux面试笔试题及答案

非常全的linux面试笔试题及答案 一.填空题:1. 在Linux系统中,以 文件 方式访问设备 .2. Linux内核引导时,从文件/etc/fstab 中读取要加载的文件系统.3. Linux文件系统中每个文件用 i节点来标识.4. 全部磁盘块由四个部分组成,分别为引导块 .专用块 . i节点表块 和数据存储块.5. 链接分为: 硬链接 和 符号链接 .6. 超级块包含了i节点表 和 空闲块表等重要的文件系统信息.7. 某文件的权限为:d-rw-_r--_r--,用数值形式表示该权限,则该八

多线程关于腾讯笔试题

今天在头条上看到一道据说是腾讯的笔试题,闲来无事,准备验证一下! 题目如下: 有一个变量int a=0:两个线程同时进行+1操作,每个线程加100次,不加锁,最后a的值是()? 根据我的理解答案不唯一,最大是两百,最小是2吧.直接上代码: class MyThread implements Runnable { static volatile long i = 0; public void run() { for (int m = 0; m < 100; m++) { i++; } } }; p

C/C++ 笔试题一

摘自 网络上的 笔试题,据说是华为的,考察的内容还算全面,也很细致: 答案 疏略 检查了下,应该没有什么大问题,但是 还是那句话,尽信之不如无,所以还是要自己思考 1.static有什么用途?(请至少说明两种) 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变. 2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所有函数访问,但不能被模块外其它函数访问.它是一个本地的全局变量. 3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用.那就是,这