1

我想创建两个应该并行执行的进程。我正在尝试使用以下代码:

PROCESS(hello_world_process, "Hello world process");
PROCESS(hello_world_process2, "Hello world process2");
AUTOSTART_PROCESSES(&hello_world_process,&hello_world_process2);
/*---------------------------------------------------------------------------*/
int i;
void program1(void)
{
    for (i=0;i<10;i++)
    {
        printf("%d from 1st process\n",i);  
    }
}

void program2(void)
{
    for (i=0;i<10;i++)
    {
        printf("%d from IIund process\n",i);    
    }
}


PROCESS_THREAD(hello_world_process, ev, data)
{
    PROCESS_BEGIN();
    program1();
    PROCESS_END();
}
PROCESS_THREAD(hello_world_process2, ev, data)
{
    PROCESS_BEGIN();
    program2();
    PROCESS_END();
}

但是第二个过程是在第一个过程完成后开始的。

输出:

Contiki-list-1532-g2ca33d4 started with IPV6, RPL
Rime started with address 1.2.3.4.5.6.7.8
MAC nullmac RDC nullrdc NETWORK sicslowpan
Tentative link-local IPv6 address fe80:0000:0000:0000:0302:0304:0506:0708
0 from 1st process
1 from 1st process
2 from 1st process
3 from 1st process
4 from 1st process
5 from 1st process
6 from 1st process
7 from 1st process
8 from 1st process
9 from 1st process
0 from IIund process
1 from IIund process
2 from IIund process
3 from IIund process
4 from IIund process
5 from IIund process
6 from IIund process
7 from IIund process
8 from IIund process
9 from IIund process

如何并行执行这两个过程?

4

1 回答 1

1

Contiki流程基于 Dunkel 的 protothreads:http ://dunkels.com/adam/pt/

因此,它们有一些细节:

  1. 它们是协作多线程的一种形式。这意味着,源代码应该明确说明在哪个点产生执行;这不是抢占式多线程,线程之间的切换是自动发生的。
  2. 它们是用 C 实现的,C 语言没有很好的开箱即用支持,因此所有 protothread 操作都仅限于主进程函数。从主进程函数调用的函数不能产生,只有主函数可以。
  3. 这些进程共享一个公共堆栈。不存在线程局部(process-local)变量的概念;static必须使用变量来跨单个进程的多次调用保留值。

您的代码存在所有这些问题:

  • 代码中没有明确的产量
  • 您期望(隐式)收益发生在子函数内
  • 该变量i实际上是全局的,因此它将在多个进程之间共享 - 可能不是您想要的。

试试这个代码:

PROCESS_THREAD(hello_world_process, ev, data)
{
    static int i;
    PROCESS_BEGIN();
    for (i=0;i<10;i++)
    {
        printf("%d from 1st process\n",i);  
        process_poll(&hello_world_process2);
        PROCESS_YIELD();
    }
    PROCESS_END();
}

PROCESS_THREAD(hello_world_process2, ev, data)
{
    static int i;
    PROCESS_BEGIN();
    for (i=0;i<10;i++)
    {
        printf("%d from IIund process\n",i);
        process_poll(&hello_world_process);
        PROCESS_YIELD();
    }
    PROCESS_END();
}
于 2019-12-22T10:59:10.847 回答