1115 交替列印FooBar

2021-10-08 13:00:09 字數 1833 閱讀 9176

題目描述:

我們提供乙個類:

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 次。建立兩個互斥...