C 1115 交替打印FooBar

一、题目描述

我们提供了一个类:

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);
}

你可能感兴趣的:(C 1115 交替打印FooBar)