执行线程的预定义顺序



有 10 个函数,例如,Function_1(打印 1 并退出(、Function_2(打印 2 并退出(等等,直到Function_10(打印 10 并退出(。

主函数分叉 10 个线程,T1 到 T10。T1 调用Function_1,T2 调用Function_2,依此类推,直到 T10 调用Function_10

当我执行主函数时,我希望输出为 1 2 3 4 ...10.

我怎样才能做到这一点?

您需要在 T0(主(和每个 T{1..10} 之间建立协议。 该协议可能看起来像(T0 将打印发送到 Tn;Tn 将打印发送到 T0(。 如果你没有消息传递(这会让生活变得容易;如果有兴趣,可以看看golang(,你可以用条件变量粗略地模拟它。 创建一个如下所示的结构:

struct ToDo {
enum { Print, Printed} Op;
int Id;
condvar_t cv;
mutex_t   lock;
};

然后每个线程变成:

void *Proc(int Id, struct ToDo *Next) {
lock(&Next->lock);
while (Next->Id != Id) {
condvar_wait(&Next->cv, &Next->lock);
}
assert(Next->Op == Print);
printf("%dn", Id);
Next->Op = Printed;
Next->Id = 0;
condvar_signal(&Next->cv);
unlock(&Next->lock);
....
}

最后是您的程序

主(( { 结构 待办事项 下一个; .../* 创建 condvar, lock/锁(和下一个锁(; Next.Id = 0;/创建线程和传递结构 */国际 i;

for (i = 1; i < 10; i++) {
Next.Id = i;
Next.Op = Print;
condvar_signal(&Next.condvar);
while (Next.Id != 0) {
condvar_wait(&Next.condvar, &Next.lock);
}
assert(Next.Op == Printed);
}
... /* join threads */
exit(0);

}

最新更新