首页 > 代码库 > 多线程笔试题(linux)
多线程笔试题(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;}
多线程笔试题(linux)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。