您需要两个同步对象,例如信号量或条件变量.这个想法是线程A在打印之前请求信号量A并且在线程B执行相反操作之后释放信号量B.
这个想法是在线程A请求信号量A之后,它将信号量降为0.下次它请求信号量A它将阻塞直到线程B释放信号量.
在伪代码中,这看起来像:
initialization:
// set semA to 1 so that the call to sem_wait in the
// even thread will succeed right away
sem_init(semA, 1)
sem_init(semB, 0)
even_thread:
to_print = 0;
loop:
sem_wait(semA);
write(to_print);
to_print += 2
sem_post(semB)
odd_thread:
to_print = 1
loop:
sem_wait(semB)
write(to_print)
to_print += 2
sem_post(semA)
Run Code Online (Sandbox Code Playgroud)
既然你想教自己线程编程,我会留给你把它转换成实际的pthreads代码.
传递一个指示符值来指示线程是否应该通过线程函数参数打印奇数或偶数。
根据相同情况,从 0(对于偶数)或 1(对于奇数)开始,并在线程和打印中保持递增 2。
您还可以打印线程 ID 和数字,以指示哪个线程正在打印什么内容。
我假设您知道如何使用 pthreads。
[更新]: pthreads链接 即使使用信号量或互斥体,您也很难按 1、2、3 等顺序获得输出,因为您永远不知道哪个线程将有机会首先执行。为此,您可能必须使用一些高级概念,例如线程优先级或使用条件变量的线程间通信。这些只是提示。我希望如果您通过该链接您会获得更多信息。