给你一个类:
public class Foo {
public void first() { print("first"); }
public void second() { print("second"); }
public void third() { print("third"); }
}
三个不同的线程 A、B、C 将会共用一个 Foo 实例。
线程 A 将会调用 first() 方法
线程 B 将会调用 second() 方法
线程 C 将会调用 third() 方法
请设计修改程序,以确保 second() 方法在 first() 方法之后被执行,third() 方法在 second() 方法之后被执行。
提示:
尽管输入中的数字似乎暗示了顺序,但是我们并不保证线程在 *** 作系统中的调度顺序。
你看到的输入格式主要是为了确保测试的全面性。
示例 1:
输入:nums = [1,2,3]
输出:"firstsecondthird"
解释:
有三个线程会被异步启动。输入 [1,2,3] 表示线程 A 将会调用 first() 方法,线程 B 将会调用 second() 方法,线程 C 将会调用 third() 方法。正确的输出是 "firstsecondthird"。
示例 2:
输入:nums = [1,3,2]
输出:"firstsecondthird"
解释:
输入 [1,3,2] 表示线程 A 将会调用 first() 方法,线程 B 将会调用 third() 方法,线程 C 将会调用 second() 方法。正确的输出是 "firstsecondthird"。
提示:
nums 是 [1, 2, 3] 的一组排列
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/print-in-order
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法一:暴力while
方法二:信号
解题思路:方法一:暴力while
这就是暴力的while,给定两个bool型的值在类中。
当第一个打印完将first置为true,当第二个打印完将second置为true。应这个方法达到让函数感知到打印到哪一个了。
1,first函数打印不需要判断,只是打印完置为true即可。
2,second函数需要判断,当first为false且second为true的时候说明不是当前函数改打印的因此一直在循环。
3,third函数中判断first和second都为true的时候循环等待。
这个方法暴力能解决,但是耗时特别长:
方法二:信号
指定两个信号,信号first和信号second。
和上面的思路一样,只是设置false和true用信号代替,while用sem_wait代替,设置true用sem_pose代替,此方法耗时很短。
代码:方法一:暴力while
typedef struct { // User defined data may be declared here. bool first; bool second; } Foo; Foo* fooCreate() { Foo* obj = (Foo*) malloc(sizeof(Foo)); // Initialize user defined data here. obj->first = false; obj->second = false; return obj; } void first(Foo* obj) { // printFirst() outputs "first". Do not change or remove this line. while(obj->first || obj->second); printFirst(); obj->first = true; } void second(Foo* obj) { while(obj->first == false || obj->second); // printSecond() outputs "second". Do not change or remove this line. printSecond(); obj->second = true; } void third(Foo* obj) { while(obj->first == false || obj->second == false); // printThird() outputs "third". Do not change or remove this line. printThird(); } void fooFree(Foo* obj) { // User defined data may be cleaned up here. free(obj); }
方法二:信号
typedef struct { // User defined data may be declared here. sem_t first; sem_t second; } Foo; Foo* fooCreate() { Foo* obj = (Foo*) malloc(sizeof(Foo)); // Initialize user defined data here. sem_init(&(obj->first), 0, 0); sem_init(&(obj->second), 0, 0); return obj; } void first(Foo* obj) { // printFirst() outputs "first". Do not change or remove this line. printFirst(); sem_post(&(obj->first)); } void second(Foo* obj) { sem_wait(&(obj->first)); // printSecond() outputs "second". Do not change or remove this line. printSecond(); sem_post(&(obj->second)); } void third(Foo* obj) { sem_wait(&(obj->second)); // printThird() outputs "third". Do not change or remove this line. printThird(); } void fooFree(Foo* obj) { // User defined data may be cleaned up here. sem_destroy(&(obj->first)); sem_destroy(&(obj->second)); }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)