題目描述:
我們提供乙個類:
class foobar
}public void bar() }}
兩個不同的執行緒將會共用乙個 foobar 例項。其中乙個執行緒將會呼叫 foo() 方法,另乙個執行緒將會呼叫 bar() 方法。
請設計修改程式,以確保 「foobar」 被輸出 n 次。
示例 1:
輸入: n = 1
輸出: 「foobar」
解釋: 這裡有兩個執行緒被非同步啟動。其中乙個呼叫 foo() 方法, 另乙個呼叫 bar() 方法,「foobar」 將被輸出一次。
示例 2:
輸入: n = 2
輸出: 「foobarfoobar」
解釋: 「foobar」 將被輸出兩次。
方法1:使用兩個訊號量
主要思路:
(1)為了讓兩個執行緒交替執行,可以使用兩個訊號量,分別標識乙個執行緒;
(2)將需要先執行的執行緒的訊號量初始化為 1,將後執行的執行緒的訊號量初始化為 0;
(3)每個執行緒在進入自己的執行函式時,先對自己的訊號量執行wait操作,則先執行的執行緒減少到了0,然後執行相關操作,最後再對另乙個執行緒的訊號量執行post操作,既增長1,而該執行緒再次執行到wait時,將會阻塞;
(4)後執行的執行緒在開始執行時,同樣先對自己的訊號量執行wait操作,由於該訊號量的初始值是 0,故會直接阻塞,知道另乙個執行緒執行結束時,對該訊號量執行了post操作,該執行緒才能接著向下執行,執行結束之際再隨另乙個執行緒的訊號量執行post操作,而該執行緒的訊號量此時已經為 0,再次進入的時候會阻塞,而另乙個執行緒,此時可以由阻塞轉為執行;
(5)如此,實現交替輸出;
#include
class
foobar
void
foo(function<
void()
> printfoo)
}void
bar(function<
void()
> printbar)}}
;
方法2:使用條件變數配合互斥量
主要思路:
(1)主要的邏輯思路和方法1一樣,只不過實現的方式變了;
#include
class
foobar
void
foo(function<
void()
> printfoo)
// printfoo() outputs "foo". do not change or remove this line.
printfoo()
; sign=
!sign;
pthread_cond_signal
(&cond)
;pthread_mutex_unlock
(&mutex);}
}void
bar(function<
void()
> printbar)
// printbar() outputs "bar". do not change or remove this line.
printbar()
; sign=
!sign;
pthread_cond_signal
(&cond)
;pthread_mutex_unlock
(&mutex);}
}};
1115 交替列印FooBar
我們提供乙個類 class foobar public void bar 兩個不同的執行緒將會共用乙個 foobar 例項。其中乙個執行緒將會呼叫 foo 方法,另乙個執行緒將會呼叫 bar 方法。請設計修改程式,以確保 foobar 被輸出 n 次。示例 1 輸入 n 1 輸出 foobar 解釋...
1115 交替列印FooBar
題目描述 我們提供乙個類 class foobar public void bar 兩個不同的執行緒將會共用乙個 foobar 例項。其中乙個執行緒將會呼叫 foo 方法,另乙個執行緒將會呼叫 bar 方法。請設計修改程式,以確保 foobar 被輸出 n 次。示例 1 輸入 n 1 輸出 foob...
力扣1115 交替列印FooBar
力扣1115.交替列印foobar 我們提供乙個類 class foobar public void bar 兩個不同的執行緒將會共用乙個 foobar 例項。其中乙個執行緒將會呼叫 foo 方法,另乙個執行緒將會呼叫 bar 方法。請設計修改程式,以確保 foobar 被輸出 n 次。建立兩個互斥...