一、题目描述
我们提供了一个类:
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 实例。其中一个线程将会调用 foo() 方法,另一个线程将会调用 bar() 方法。
请设计修改程序,以确保 "foobar" 被输出 n 次。
示例 1:
输入: n = 1
输出: "foobar"
解释: 这里有两个线程被异步启动。其中一个调用 foo() 方法, 另一个调用 bar() 方法,"foobar" 将被输出一次。
示例 2:
输入: n = 2
输出: "foobarfoobar"
解释: "foobar" 将被输出两次。
二、程序实例
方法1.
执行用时 :24 ms, 在所有 C 提交中击败了40.00%的用户
内存消耗 :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.
执行用时 :36 ms, 在所有 C 提交中击败了31.43%的用户
内存消耗 :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);
}
网友评论