我正在使用客户端(使用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 );
}
}
因为我对此基本上是新手,所以我错过了一些明显的东西,因为我仍然有内存访问冲突“似乎”在堆栈数组上随机发生。
答案 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