北邙山小气鬼

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

leetcode【C语言】——按序打印、

我们提供了一个类:

public class Foo {
public void one() { print("one"); }
public void two() { print("two"); }
public void three() { print("three"); }
}

三个不同的线程将会共用一个 Foo 实例。

线程 A 将会调用 one() 方法
线程 B 将会调用 two() 方法
线程 C 将会调用 three() 方法

请设计修改程序,以确保 two() 方法在 one() 方法之后被执行,three() 方法在 two() 方法之后被执行。

示例 1:

输入: [1,2,3]
输出: "onetwothree"
解释:
有三个线程会被异步启动。
输入 [1,2,3] 表示线程 A 将会调用 one() 方法,线程 B 将会调用 two() 方法,线程 C 将会调用 three() 方法。
正确的输出是 "onetwothree"。

示例 2:

输入: [1,3,2]
输出: "onetwothree"
解释:
输入 [1,3,2] 表示线程 A 将会调用 one() 方法,线程 B 将会调用 three() 方法,线程 C 将会调用 two() 方法。
正确的输出是 "onetwothree"。

注意:

尽管输入中的数字似乎暗示了顺序,但是我们并不保证线程在操作系统中的调度顺序。
你看到的输入格式主要是为了确保测试的全面性。

typedef struct {
// User defined data may be declared here.
pthread_mutex_t t1,t2;
} Foo;

Foo* fooCreate() {
Foo* obj = (Foo*) malloc(sizeof(Foo));

// Initialize user defined data here.
pthread_mutex_init(&obj->t1,NULL);  
pthread_mutex_init(&obj->t2,NULL);  

pthread_mutex_lock(&obj->t1);
pthread_mutex_lock(&obj->t2);

return obj;

}

void first(Foo* obj) {

// printFirst() outputs "first". Do not change or remove this line.
printFirst();
pthread_mutex_unlock(&obj->t1);

}

void second(Foo* obj) {

// printSecond() outputs "second". Do not change or remove this line.
pthread_mutex_lock(&obj->t1);
printSecond();
pthread_mutex_unlock(&obj->t2);

}

void third(Foo* obj) {

// printThird() outputs "third". Do not change or remove this line.
 pthread_mutex_lock(&obj->t2);
printThird();

}

void fooFree(Foo* obj) {
// User defined data may be cleaned up here.
    pthread_mutex_destroy(&obj->t1);
    pthread_mutex_destroy(&obj->t2);
    free(obj);
}
posted on 2020-03-16 10:30  北邙山小气鬼  阅读(138)  评论(0)    收藏  举报