读书人

如何才能得实现真正意义上的线程并发

发布时间: 2012-02-13 17:20:26 作者: rapoo

怎么才能得实现真正意义上的线程并发
[size=25px][/size]color=#FF0000]怎么才能得实现真正意义上的线程并发,在一个程序中有多个线程同时执行~[/color]

[解决办法]
多CPU咯
[解决办法]
楼主是不是想知道真正的多线程程序是什么样的,他们一般要有多少个并发的线程?

我觉得看你的具体应用了。
[解决办法]
真正意义上的线程并发,只有多个CPU才能实现,否则都是利用同一个CPU的分时处理来实现的伪并发,也就是说在某一时间点上,永远都是一个线程在执行,大概如

下图所示:

线程A --- ---

线程B -- ---

线程C --- ---
[解决办法]
如果是像搂住所言,那么这个并发机制不仅仅需要靠多处理器来完成,而且是对称多处理器。比如说现在市面上典型的双核处理器。

那么如果是多处理器的话,那么这两个并发线程将可能在两个不同的进程中执行,除非两个核处于同一个进程上下文环境中。

我下面将给出Blackfin561双核DSP处理器的演示,就是像楼主要看的运行结果:


P0: 3
3
3
3
3
1



P1: Breakpoint Hit at <ff6009f8>



P0: 1

P1: 2

P0: 1

P1: 2

P0: 1

P1: 2

P0: 1

P1: 2




P0: Breakpoint Hit at <ffa023ba>


上面,p0表示处理器0(即核A);p1表示处理器1(即核B)。在核B运行开始时会有一个断点。在程序运行结束后也有一个断点。

下面贴出源代码:

C/C++ code
// core A#include <stdio.h>#define SICA_SYSCR    *(volatile unsigned short*)0xffc00104#define SICB_SYSCR    *(volatile unsigned short*)0xffc01104int main(int argc, const char* argv[]){    for(int i=0; i<5; i++)        puts("3");        SICA_SYSCR &= ~0x20;    // Enable core B        for(int i=0; i<5; i++)        puts("1");            return 0;}// core B#include <stdio.h>int main(int argc, const char* argv[]){    for(int i=0; i<5; i++)        puts("2");        return 0;}
[解决办法]
不好意思。上面结果中,最后一个P1的“2”没有显示出来。因为在模拟环境下,当核A运行结束后核B也暂停执行了。所以我得把核A的断点去掉,让它处于idle状态,然后让核B继续运行。那么紧接在前面结果的下面,输出为:


P0: Breakpoint Hit at <ffa023ba>

P0: Breakpoint Hit at <ffa023ba>

P0: Breakpoint Hit at <ffa023ba>

P0: Breakpoint Hit at <ffa023ba>

P0: Breakpoint Hit at <ffa023ba>

P0: Breakpoint Hit at <ffa023ba>



P1: 2




P1: Breakpoint Hit at <ff601d4a>

读书人网 >C++

热点推荐