一、題目描述
我們提供了一個類:
class FooBar {
public void foo() {
for (int i = 0; i < n; i++) {
print("foo");
}
}
public void bar() {
for (int i = 0; i < n; i++) {
print("bar");
}
}
}
兩個不同的線程將會共用一個 FooBar 實例。其中一個線程將會調(diào)用 foo() 方法,另一個線程將會調(diào)用 bar() 方法。
請設(shè)計修改程序,以確保 "foobar" 被輸出 n 次。
示例 1:
輸入: n = 1
輸出: "foobar"
解釋: 這里有兩個線程被異步啟動。其中一個調(diào)用 foo() 方法, 另一個調(diào)用 bar() 方法,"foobar" 將被輸出一次。
示例 2:
輸入: n = 2
輸出: "foobarfoobar"
解釋: "foobar" 將被輸出兩次。
二、程序?qū)嵗?/h1>
方法1.
執(zhí)行用時 :24 ms, 在所有 C 提交中擊敗了40.00%的用戶
內(nèi)存消耗 :8.9 MB, 在所有 C 提交中擊敗了100.00%的用戶
typedef struct {
int n;
pthread_mutex_t lock1;
pthread_mutex_t lock2;
} FooBar;
FooBar* fooBarCreate(int n) {
FooBar* obj = (FooBar*) malloc(sizeof(FooBar));
obj->n = n;
pthread_mutex_init(&obj->lock1, NULL);
pthread_mutex_init(&obj->lock2, NULL);
pthread_mutex_lock(&obj->lock2);
return obj;
}
void foo(FooBar* obj) {
for (int i = 0; i < obj->n; i++) {
pthread_mutex_lock(&obj->lock1);
// printFoo() outputs "foo". Do not change or remove this line.
printFoo();
pthread_mutex_unlock(&obj->lock2);
}
}
void bar(FooBar* obj) {
for (int i = 0; i < obj->n; i++) {
pthread_mutex_lock(&obj->lock2);
// printBar() outputs "bar". Do not change or remove this line.
printBar();
pthread_mutex_unlock(&obj->lock1);
}
}
void fooBarFree(FooBar* obj) {
free(obj);
}
方法2.
執(zhí)行用時 :36 ms, 在所有 C 提交中擊敗了31.43%的用戶
內(nèi)存消耗 :8.7 MB, 在所有 C 提交中擊敗了100.00%的用戶
typedef struct {
int n;
int foo;
int bar;
} FooBar;
FooBar* fooBarCreate(int n) {
FooBar* obj = (FooBar*) malloc(sizeof(FooBar));
obj->n = n;
obj->foo = 0;
obj->bar = 1;
return obj;
}
void foo(FooBar* obj) {
for (int i = 0; i < obj->n; i++) {
while(obj->foo) usleep(1);
// printFoo() outputs "foo". Do not change or remove this line.
printFoo();
obj->bar = 0;
obj->foo = 1;
}
}
void bar(FooBar* obj) {
for (int i = 0; i < obj->n; i++) {
while(obj->bar) usleep(1);
// printBar() outputs "bar". Do not change or remove this line.
printBar();
obj->foo = 0;
obj->bar = 1;
}
}
void fooBarFree(FooBar* obj) {
free(obj);
}