執行緒同步題目

2021-06-20 12:13:26 字數 4061 閱讀 4198

題目一:子執行緒迴圈5次,接著主線程迴圈10次,
接著又回到子執行緒迴圈5次,接著再回到主線程又迴圈10次, 

如此迴圈6次,試寫出**。

解法一,mutex
#include #include #include #include #include //如果只有乙個mutex,在建立了子執行緒,主線程休眠後,讓子執行緒執行,子執行緒執行了10次後,休眠。

//過了這個休眠時間,排程執行緒執行的時候,如果系統任務多,可能仍是子執行緒在執行的。

pthread_mutex_t mutex;

//臨界區資料

//00表示初始狀態

//01表示之前在執行子執行緒

//10表示之前在執行主線程

int flag1,flag2;

//如果不用條件變數,只用mutex。

//那麼子執行緒和主線程都會不斷的獲得mutex,然後判斷自己是否該執行,如果不該執行,就釋放,然後sleep下。

//如果可以執行就執行,然後再sleep。

//這樣效率太低。

//pthread_cond_t cond;

void loopchild()

void loopparent()

void setparentflag()

void setchildflag()

//輪到子執行緒執行

bool ischildturn()

//輪到父執行緒執行

bool isparentturn()

void *func(void *arg)

pthread_mutex_unlock(&mutex);

sleep(1); }}

int main()

} pthread_mutex_unlock(&mutex);

sleep(1); }

pthread_cancel(pid);

pthread_mutex_destroy(&mutex);

exit(0);

}

解法二,使用condition variable 

#include #include #include #include #include //如果只有乙個mutex,在建立了子執行緒,主線程休眠後,讓子執行緒執行,子執行緒執行了10次後,休眠。

//過了這個休眠時間,排程執行緒執行的時候,如果系統任務多,可能仍是子執行緒在執行的。

pthread_mutex_t mutex;

//臨界區資料

//00表示初始狀態

//01表示之前在執行子執行緒

//10表示之前在執行主線程

int flag1,flag2;

//如果不用條件變數,只用mutex。

//那麼子執行緒和主線程都會不斷的獲得mutex,然後判斷自己是否該執行,如果不該執行,就釋放,然後sleep下。

//如果可以執行就執行,然後再sleep。

//這樣效率太低。

pthread_cond_t cond;

void loopchild()

void loopparent()

void setparentflag()

void setchildflag()

//輪到子執行緒執行

bool ischildturn()

void *func(void *arg)

loopchild();

setchildflag();

pthread_mutex_unlock(&mutex);

pthread_cond_signal(&cond); }}

int main()

loopparent();

setparentflag();

cnt++;

if(6 == cnt)

pthread_mutex_unlock(&mutex);

pthread_cond_signal(&cond); }

pthread_cancel(pid);

sleep(1);

pthread_mutex_destroy(&mutex);

pthread_cond_destroy(&cond);

exit(0);

}

第二題

/*

編寫乙個程式,開啟3個執行緒,這3個執行緒的id分別為a、b、c,

每個執行緒將自己的id在螢幕上列印10遍,要求輸出結果必須按abc的順序顯示;如:abcabc….依次遞推。

*/#include #include #include #include #include pthread_t pida, pidb, pidc;

sem_t sema, semb, semc;

void *funca(void *arg)

return null;

}void *funcb(void *arg)

return null;

}void *funcc(void *arg)

return null;

}int main( )

第三題:生產者消費者問題

這是乙個非常經典的多執行緒題目,題目大意如下:有乙個生產者在生產產品,這些產品將提供給若干個消費者去消費,為了使生產者和消費者能併發執行,在兩者之間設定乙個有多個緩衝區的緩衝池,生產者將它生產的產品放入乙個緩衝區中,消費者可以從緩衝區中取走產品進行消費,所有生產者和消費者都是非同步方式執行的,但它們必須保持同步,即不允許消費者到乙個空的緩衝區中取產品,也不允許生產者向乙個已經裝滿產品且尚未被取走的緩衝區中投放產品。

解法一,使用mutex

#include #include #include #include #define nums 10  //表示生產,消費的次數  

#define capacity 5 //定義緩衝區最大值

int capacity = 0; //當前緩衝區的產品個數

pthread_mutex_t mylock = pthread_mutex_initializer;//互斥量

void* produce(void *args)

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);

}

結果滿足題意。但是這存在乙個問題,極端情況下,生產者每次都加鎖成功,那緩衝區會滿,產品無法放入緩衝區。消費者會被餓死,因為他一直無法獲得互斥量。

改進?(google面試題)

有四個執行緒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....

請設計程式。

同步 執行緒同步

操作執行的先後順序。同步指兩個或兩個以上隨時間變化的量在變化過程中保持一定的相對關係。同步 英語 synchronization 指對在乙個系統中所發生的事件 event 之間進行協調,在時間上出現一致性與統一化的現象。在系統中進行同步,也被稱為及時 in time 同步化的 synchronous...

11 6 執行緒 執行緒同步

除了計算機體系結構的因素以外,程式使用變數的方式也會引起競爭,也會導致不一致的情況發生。例如,可能會對某個變數加1,然後基於這個數值做出某種決定。增量操作這一步和做出決定這一步兩者的組合並非原子操作,因而給不一致情況提供了可能。1.互斥量 可以通過使用pthread的互斥介面保護資料,確保同一時間只...

linux 執行緒 執行緒同步

因為執行緒獨自擁有的只有棧,其他的區域執行緒共同擁有。並且對共享區域的操作並不都是原子的。對共享區域的操作順序又是不確定的。就像建立兩個檔案描述符同時指向 同一檔案,並且連續向檔案中寫入那麼寫的東西可能是亂七八糟的。這時就需要執行緒對共享區的同步。而另一種情況是,多個執行緒的指令執行順序需要同步。這...