在线程之间同步堆栈

时间:2012-03-06 08:23:39

标签: c pthreads

我正在使用客户端(使用GUI和套接字)。 GUI(在主线程上运行)创建我的协议的fly命令,每次我创建一个新命令时,我将它附加到动态堆栈中。

在另一个线程(使用pthread)中,我检查堆栈中是否有命令然后使用套接字(非块btw)逐步发送它。当堆栈顶部的命令完成后,我弹出堆栈(这意味着命令被删除,第一个元素下面的每个命令都被推高)。

现在您可能已经猜到我有很大的问题要同步...我尝试使用一些标志,互斥但我总是在内存上遇到一些访问冲突。

基本上我正在做的是:

在主线程中(即)用户按下按钮时:

char cmd[ 50 ] = "My new protocol command";

AppendCommandToSendStack( cmd );

在另一个主题中:

if( SendStackCount )
{
     SendCommand( 0 ); // 0 = The top of the stack.

     if( IsCommandDoneSending( 0 ) )
     {
          RemoveCommandFromStack( 0 );
     }
}

任何人都可以帮助我,或者给我一些关于如何使这种机制发挥作用的指示。或者另一种方法会导致与我试图实现相同或类似的工作流程。

提前Tks!

[更新]

我开始阅读信号量,它似乎正是我需要的......但它似乎不起作用......这就是我在伪代码中所做的:

sem_t mutex;

int stack_count;

command *stack;

main()
{
    // Init & Connect client.

    // Start Thread

    sem_init( &lock_stack, 0, 1 );

    while( 1 )
    {
        sem_wait( &lock_stack );

        ++stack_count;

        stack = ( command * ) realloc( stack, stack_count * sizeof( command ) );

        strcpy( stack[ stack_count - 1 ].cmd, "new command" );

        sem_post( &lock_stack );
    }
}


thread()
{
    while( 1 )
    {
        sem_wait( &lock_stack );

        if( stack_count )
        {
            // Send stack[ 0 ].cmd via socket then when done pop the stack like this:

            --stack_count;

            if( 0 < stack_count )
            {
                memcpy( &stack[ 0 ],
                    &stack[ 1 ],
                    ( stack_count - 1 ) * sizeof( command ) );
            }        
        }

        sem_post( &lock_stack );
    }
}

因为我对此基本上是新手,所以我错过了一些明显的东西,因为我仍然有内存访问冲突“似乎”在堆栈数组上随机发生。

2 个答案:

答案 0 :(得分:2)

你有一个生产者 - 消费者问题的典型例子。您希望produce命令,而其他线程consume。您可以查看http://en.wikipedia.org/wiki/Producer-consumer_problem,它解释了如何实现基本的生产者 - 消费者问题。

答案 1 :(得分:0)

一个简单的解决方案是:

 Thread 1 :
       lock mutex
       put items on stack
       unlock mutex


  Thread 2 :
     loop
        lock mutex
        check item on stack
        if somthing get item on stack
        unlock mutex

更有效的解决方案是:

 Thread 1 :
      lock mutex
      put items on stack
      signal on conditionVariable
      unlock mutex

 Thread 2 : 
      lock mutex 
      check item on stack 
      if none wait on conditionVariable
      // here you will be woke up when there is a signal
      get item on the stack
      unlock mutex
      do your work