您的位置:程序门 -> c/c++ -> c++ 语言



怎么才能得实现真正意义上的线程并发


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


怎么才能得实现真正意义上的线程并发[已结贴,结贴人:zsz0147]
发表于:2007-11-24 14:15:53 楼主
color=#ff0000]怎么才能得实现真正意义上的线程并发,在一个程序中有多个线程同时执行~[/color]
发表于:2007-11-24 14:16:571楼 得分:0
发表于:2007-11-24 14:43:332楼 得分:0
真正意义?什么意思?多个处理器分别处理?还是一个处理器分时处理?
发表于:2007-11-24 14:59:013楼 得分:5
多cpu咯
发表于:2007-11-24 15:24:124楼 得分:0
那就要靠多cpu和实时os
发表于:2007-11-24 15:30:485楼 得分:10
楼主是不是想知道真正的多线程程序是什么样的,他们一般要有多少个并发的线程?

我觉得看你的具体应用了。
发表于:2007-11-24 15:32:246楼 得分:0
不是有多少个线程才能算作多线程,而是你需要多少就用多少。
发表于:2007-11-24 15:41:237楼 得分:50
真正意义上的线程并发,只有多个cpu才能实现,否则都是利用同一个cpu的分时处理来实现的伪并发,也就是说在某一时间点上,永远都是一个线程在执行,大概如

下图所示:

线程a       ---                 ---

线程b             --       ---

线程c                 ---             ---
发表于:2007-11-24 15:45:528楼 得分:0
也就是真正拥有多个处理器的时候,楼上正解!
发表于:2007-11-24 16:27:309楼 得分:0
顶一个
发表于:2007-11-24 17:01:2310楼 得分:0
就像fetag所说的,分时外理~~~~

好比我创建了两个线程
handle   hthread[2];
hthread[0]=createthread(..,threadproc1,...);
hthread[1]=createthread(..,threadproc2,...);
sleep(100);
for(int   i=0;i <5;i++)
    cout < <"3" < <endl;

void   winapi   threadproc1()
{
  for(int   i=0;i <5;i++)
    cout < <"1" < <endl;
}
void   winapi   threadproc2()
{
  for(int   i=0;i <5;i++)
    cout < <"2" < <endl;
}

这个程序输出的是
3
3
3
3
3
1
1
1
1
1
2
2
2
2
2


能不能是
3
3
3
3
3
1
2
1
2
1
2
1
2
1
2
发表于:2007-11-24 17:09:2111楼 得分:0
这个需要学习一下
发表于:2007-11-25 12:31:0712楼 得分:10
如果是像搂住所言,那么这个并发机制不仅仅需要靠多处理器来完成,而且是对称多处理器。比如说现在市面上典型的双核处理器。

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

我下面将给出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*)0xffc01104 int main(int argc, const char* argv[]) { forint i=0; i<5; i++) puts("3"); sica_syscr &= ~0x20; // enable core b forint i=0; i<5; i++) puts("1"); return 0; } // core b #include <stdio.h> int main(int argc, const char* argv[]) { forint i=0; i<5; i++) puts("2"); return 0; }


这里就用了两个进程(两个main()函数)来并发处理输出。当然,在操作系统环境下可以将两个核进行同步到一个进程的上下文中。因为进程资源往往是放在共享存储区。而每个核有自己内部存储区(一般是sram)以及各种核心寄存器。而在blackfin561中每个核都有自己的核心中断控制器以及系统中断控制器。
发表于:2007-11-25 12:38:2413楼 得分:25
不好意思。上面结果中,最后一个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>

发表于:2007-11-26 01:18:2514楼 得分:0
多安几个cpu...
发表于:2007-11-26 07:02:0115楼 得分:0
看看   《多核并发》
发表于:2007-11-27 11:09:0816楼 得分:0
对不起呀,有可能是我表达的有错误,
我说的是分时外理,

我这几天在机器上也试了一下
输出的结果就是上面那个,也就是说是我想要的

有可能是我机器的问题,多执行几次程序就可以了出现现在的结果了,谢谢你们的支持~!


现在还有一个问题就是

线程不是调用的函数吗~!我想怎么调用带参数的函数
也就是说
void   winapi   threadproc1(int   n)
{
    for(int   i=0;i <n;i++)
        cout < <"1" < <endl;
}

hthread=createthread(..,threadproc1(5),...);
发表于:2007-11-27 12:11:1617楼 得分:0
除了cpu,还要求其它资源都是多个....

那才可以吧?

不然,要争夺单一资源的时候,如果显示器

那也一样有的被挂起或是其它的等待操作

那也不是所谓的"真正意义"吧?

呵呵....


快速检索

最新资讯
热门点击