Leetcode 1116. ゼロと奇数を印刷(acなし)
2496 ワード
コンソールは大丈夫です.なぜacがないのか分かりません.
このようなクラスがあるとします.
class ZeroEvenOdd { public ZeroEvenOdd(int n) { ... }//コンストラクション関数public void zero(printNumber){...}//0 public void even(printNumber){...}のみ印刷//偶数public void odd(printNumber){...}のみ印刷//奇数のみ印刷}同じZeroEvenOddクラスインスタンスが3つの異なるスレッドに渡されます.
スレッドAはゼロ()を呼び出し、0のみ出力します.スレッドBはeven()を呼び出し、偶数のみを出力します.スレッドCはodd()を呼び出し、奇数のみを出力します.各スレッドにはprintNumberメソッドがあり、整数を出力します.与えられたコードを修正して整数シーケンス0102030400506を出力してください...シーケンスの長さは2 nでなければなりません.
例1:
入力:n=2出力:0102の説明:3つのスレッドが非同期で実行され、そのうちの1つがzero()を呼び出し、もう1つのスレッドがeven()を呼び出し、最後のスレッドがodd()を呼び出す.正しい出力は「0102」です.例2:
入力:n=5出力:“01020304005”
ソース:力ボタン(LeetCode)リンク:https://leetcode-cn.com/problems/print-zero-even-odd著作権はインターネットの所有に帰属する.商業転載は公式の授権に連絡してください.非商業転載は出典を明記してください.
#include
#include
#include
#include
#include
using namespace std;
class ZeroEvenOdd {
private:
int n;
std::mutex mutex_t;
std::condition_variable cond;
bool is0 = true;
bool is1 = true;
public:
ZeroEvenOdd(int n) {
this->n = n;
}
// printNumber(x) outputs "x", where x is an integer.
void zero(function printNumber) {
for (int i = 0; i < n; i++)
{
std::unique_lock<:mutex> lk(mutex_t);
cond.wait(lk, [this]() {return is0; });
printNumber(0);
is0 = false;
cond.notify_all();
}
}
void even(function printNumber) {
if (n == 0)return;
for (int i = 1; i <= n; i++)
{
std::unique_lock<:mutex> lk(mutex_t);
cond.wait(lk, [this]() {return !is0&&is1; });
if (i % 2)
{
printNumber(i);
is0 = true;
is1 = false;
}
cond.notify_all();
}
}
void odd(function printNumber) {
if (n == 0)return;
for (int i = 1; i <= n; i++)
{
std::unique_lock<:mutex> lk(mutex_t);
cond.wait(lk, [this]() {return !is0 && !is1; });
if (i % 2 == 0)
{
printNumber(i);
is0 = true;
is1 = true;
}
cond.notify_all();
}
}
};
int main()
{
std::function f1= [](int x) {printf("%d", x); };
ZeroEvenOdd obj(5);
thread t1(std::bind(&ZeroEvenOdd::zero,&obj,f1));
thread t2(std::bind(&ZeroEvenOdd::even, &obj,f1));
thread t3(std::bind(&ZeroEvenOdd::odd, &obj,f1));
t1.join();
t2.join();
t3.join();
return 0;
}
このようなクラスがあるとします.
class ZeroEvenOdd { public ZeroEvenOdd(int n) { ... }//コンストラクション関数public void zero(printNumber){...}//0 public void even(printNumber){...}のみ印刷//偶数public void odd(printNumber){...}のみ印刷//奇数のみ印刷}同じZeroEvenOddクラスインスタンスが3つの異なるスレッドに渡されます.
スレッドAはゼロ()を呼び出し、0のみ出力します.スレッドBはeven()を呼び出し、偶数のみを出力します.スレッドCはodd()を呼び出し、奇数のみを出力します.各スレッドにはprintNumberメソッドがあり、整数を出力します.与えられたコードを修正して整数シーケンス0102030400506を出力してください...シーケンスの長さは2 nでなければなりません.
例1:
入力:n=2出力:0102の説明:3つのスレッドが非同期で実行され、そのうちの1つがzero()を呼び出し、もう1つのスレッドがeven()を呼び出し、最後のスレッドがodd()を呼び出す.正しい出力は「0102」です.例2:
入力:n=5出力:“01020304005”
ソース:力ボタン(LeetCode)リンク:https://leetcode-cn.com/problems/print-zero-even-odd著作権はインターネットの所有に帰属する.商業転載は公式の授権に連絡してください.非商業転載は出典を明記してください.