剛無意中看到morewindows博主秒殺多執行緒面試題(第一篇就有他收集的面試題。那我就用來檢驗一下自己學的怎麼樣吧。
前面的選擇題那些跳過,直接看最後的程式設計題。
子執行緒迴圈10 次,接著主線程迴圈100 次,接著又回到子執行緒迴圈10 次,接著再回到主線程又迴圈100 次,如此迴圈50次,試寫出**。
編寫乙個程式,開啟3個執行緒,這3個執行緒的id分別為a、b、c,每個執行緒將自己的id在螢幕上列印10遍,要求輸出結果必須按abc的順序顯示;如:abcabc….依次遞推。
有四個執行緒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....
請設計程式。
生產者消費者問題
這是乙個非常經典的多執行緒題目,題目大意如下:有乙個生產者在生產產品,這些產品將提供給若干個消費者去消費,為了使生產者和消費者能併發執行,在兩者之間設定乙個有多個緩衝區的緩衝池,生產者將它生產的產品放入乙個緩衝區中,消費者可以從緩衝區中取走產品進行消費,所有生產者和消費者都是非同步方式執行的,但它們必須保持同步,即不允許消費者到乙個空的緩衝區中取產品,也不允許生產者向乙個已經裝滿產品且尚未被取走的緩衝區中投放產品。
讀者寫者問題
這也是乙個非常經典的多執行緒題目,題目大意如下:有乙個寫者很多讀者,多個讀者可以同時讀檔案,但寫者在寫檔案時不允許有讀者在讀檔案,同樣有讀者讀時寫者也不能寫。
是否熟悉posix多執行緒程式設計技術?如熟悉,編寫程式完成如下功能:
1)有一int型全域性變數g_flag初始值為0;
2) 在主線稱中起動執行緒1,列印「this is thread1」,並將g_flag設定為1
3) 在主線稱中啟動執行緒2,列印「this is thread2」,並將g_flag設定為2
5) 主線程在檢測到g_flag從1變為2,或者從2變為1的時候退出
第三題、第四題、第五題第一反應用條件變數來實現。第六題和第七題用讀寫鎖來實現。
#include #include #include #include #include //#define debug 1
#define num 3
int n=0;
pthread_mutex_t mylock=pthread_mutex_initializer;//互斥量
pthread_cond_t qready=pthread_cond_initializer;//條件變數
void * thread_func(void *arg)
else
}// printf("%d ",param+1);
printf("%c ",c);
n=(n+1)%num;
pthread_mutex_unlock(&mylock);
pthread_cond_broadcast(&qready);
}
return (void *)0;
}int main(int argc, char** argv) else
pthread_mutex_unlock(&mylock);
}return ((void *) 0);
}void * consume(void *args)
else
pthread_mutex_unlock(&mylock);
}return ((void *) 0);
}int main(int argc, char** argv)
err = pthread_create(&consume_tid, null, consume, null);
if (err != 0)
err = pthread_join(produce_tid, &ret);//主線程等到子執行緒退出
if (err != 0)
err = pthread_join(consume_tid, &ret);
if (err != 0)
return (exit_success);
}
執行結果:
結果滿足題意。但是這存在乙個問題,極端情況下,生產者每次都加鎖成功,那緩衝區會滿,產品無法放入緩衝區。消費者會被餓死,因為他一直無法獲得互斥量。方法二,解決了導致某一方餓死的可能性。
update:
在第一種方法中,當緩衝區滿時,讓生產者睡眠;當緩衝區空,讓消費者睡眠。這樣也能解決某一方老是加鎖成功。
方法二:採用兩個互斥量來完成
流程圖如下:
執行截圖:
上**:
/*
* file: main.c
* author: root
* * created on 2023年5月22日, 上午9:35
*/#include #include #include #include #define nums 10 //表示生產,消費的次數
#define capacity 5 //定義緩衝區最大值
int capacity = 0; //當前緩衝區的產品個數
pthread_mutex_t mylocka=pthread_mutex_initializer;
pthread_mutex_t mylockb=pthread_mutex_initializer;
void *produce(void *args)
else
err=pthread_mutex_unlock(&mylockb);
}return ((void *) 0);
}void * consume(void *args)
else
pthread_mutex_unlock(&mylocka);
}return ((void *) 0);
}int main(int argc, char** argv)
err = pthread_create(&consume_tid, null, consume, null);
if (err != 0)
err = pthread_join(produce_tid, &ret);//主線程等到子執行緒退出
if (err != 0)
err = pthread_join(consume_tid, &ret);
if (err != 0)
return (exit_success);
}
多執行緒面試題
題目 主線程執行10次,子執行緒執行10次,此過程重複50次 package com.thread.test function 主線程執行10次,子執行緒執行10次,此過程重複50次 public class threadproblem start for int j 0 j 50 j class ...
面試題 多執行緒
現有程式同時啟動了4個執行緒去呼叫testdo.dosome key,value 方法,由於testdo.dosome key,value 方法內的 是先暫停1秒,然後再輸出以秒為單位的當前時間值,所以,會列印出4個相同的時間值,如下所示 4 4 1258199615 1 1 1258199615 ...
多執行緒面試題
執行緒池的優點?執行緒是稀缺資源,使用執行緒池可以減少建立和銷毀執行緒的次數,每個工作執行緒都可以重複使用。執行緒池為執行緒生命週期開銷問題和資源不足問題提供了解決方案。可以根據系統的承受能力,調整執行緒池中工作執行緒的數量,防止因為消耗過多記憶體導致伺服器崩潰。public threadpoole...