gpt4 book ai didi

C: 使用 pthreads 和程序不退出 for 循环

转载 作者:太空宇宙 更新时间:2023-11-04 08:35:43 24 4
gpt4 key购买 nike

我正在模拟一个设备,该设备将接收字节数据并在时钟具有下降沿时写入寄存器。我创建了一个单独的 pthread,它将负责在高时钟和低时钟之间移动时钟。

现在我的问题是,在主线程中,我让控制台要求用户键入一个十六进制值以写入“设备”,然后它调用 SendCommand(uint32_t addr, uint16_t data) 函数来执行此操作。因为它应该在每个时钟周期一次发送一位,所以我把它放在一个 for 循环中。这是发送命令函数:

void SendCmd(uint32_t loadAddr, uint16_t data)
{
dest = &loadAddr;
int i;
printf("%d\n\n",status);
for(i=15; i>=0; --i) {
pthread_cond_wait(&rising_edge, &data_lock);
*dest = (*dest << 1)|(data & 0x8000) >> 15;
// ^^^^^^^^ get MSB
// ^^^^^ move the MSB down to the LSB, assuming the
// peripheral wants the bit in the LSB.
pthread_cond_wait(&falling_edge, &data_lock);
data <<= 1;
printf("%d\ti=%d\n",*dest,i);
}
pthread_mutex_unlock(&data_lock);
status = ENABLED_IDLE;
}

当 i=0 时,循环应该退出并返回到主函数,它将要求用户输入另一个十六进制值。但它没有,而且我似乎无法找到为什么它会在退出循环之前卡住。

编辑:卡住实际上发生在函数执行之前:

int main()
{
State status = DISABLED;
Clock clk = LOW;
int exit_flag = 0;
char Command[20];
pthread_t clk_t;
pthread_cond_init(&en_sig, NULL);
pthread_cond_init(&rising_edge, NULL);
pthread_cond_init(&falling_edge, NULL);
pthread_mutex_init(&clk_lock, NULL);
pthread_mutex_init(&data_lock, NULL);
pthread_create(&clk_t, NULL, simClk, NULL);
while(!exit_flag)
{
if(status != ENABLED_ACTIVE)
{
fputs("(enable/disable/write [addr] [word_0] [word_1*]/quit): ", stdout);
fflush(stdout);
if ( fgets(Command, sizeof Command, stdin) != NULL )
{
char *newline = strchr(Command, '\n');
if ( newline != NULL )
{
*newline = '\0';
}
}

if(strcasecmp(Command,"quit")==0)
{
printf("\nShutting Down!\n\n");
pthread_cancel(&clk_t);
pthread_mutex_destroy(&clk_lock);
exit_flag = ~exit_flag;
continue;
}

if(strcasecmp(Command,"enable")==0)
{
if(status != DISABLED)
{
printf("\nSynthesizer is already enabled!\n\n");
continue;
}
status = ENABLED_IDLE;
nanosleep(&ecsWait, NULL);
printf("\nEnabled!\n\n");
pthread_cond_signal(&en_sig);
continue;
}

if(strcasecmp(Command,"disable")==0)
{
status = DISABLED;
// pthread_mutex_lock(&clk_lock);
printf("\nDisabled!\n\n");
continue;
}

if(strcasecmp(Command,"w")==0)
{
if(status != ENABLED_IDLE)
{
printf("\nSynthesizer is not enabled!\n\n");
continue;
}
printf("\nWriting!\n\n");
status = ENABLED_ACTIVE; //FREEZE OCCURS HERE!
SendCmd(NREGISTER_ADDR,0xF13F);
continue;
}

printf("Invalid command!\n");
}
}
return 0;

}

最佳答案

问题:主线程需要在另一个线程调用 pthread_cond_signal 之前调用 pthread_cond_wait 。如果另一个线程在主线程等待条件之前发出条件信号,则 pthread_cond_wait 将永远不会返回。

因此您需要确保事情以正确的顺序发生,这就是互斥锁的用武之地。您应该在创建另一个线程之前锁定互斥锁,并且只有在您创建其他线程时才解锁互斥锁使用条件变量完成。另一个线程需要锁定互斥量、发出条件信号并解锁互斥量。

主线程伪代码

init mutex
lock the mutex
init condition variable
create the other thread
while ( !done )
{
wait for condition
do something useful after the condition is signaled
}
unlock the mutex

其他线程想要发出条件信号时的伪代码

lock the mutex
signal the condition
unlock the mutex

明显的问题:“但是如果主线程总是锁定互斥锁,那么其他线程将如何获得互斥锁?”。回答:“pthread_cond_wait 在内部解锁互斥锁,这就是将互斥锁传递给 pthread_cond_wait 的原因。”

关于C: 使用 pthreads 和程序不退出 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26284852/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com