流程基本如下:
PC->批处理设备->多个终端设备
1.从PC发出5个命令
2.批处理设备收到命令后,将命令存入线程队列 taskQueue
3.从线程队列中取出task,并5个线程并发处理task
4.5个终端设备同时响应,并开始处理
问题:
但在实际测试中发现,无法实现多线程并发,只能等待一个任务完成后才能执行下一个任务
而在我的分析中,taskHandler这个函数的处理,由于加上了互斥锁,导致此问题
但是不加上互斥锁,又会造成数据混乱,导致终端设备处理出现异常
想请教一下,能否在不去掉互斥锁的前提下(优先保证数据正常),达成多线程并发?
非常感谢!
代码如下:
// 添加成功返回0,失败返回-1
int threadpoolAddTask(ST_TASK task)
{
int ret;
pthread_mutex_lock(&mutex);
ret = enqueue(&taskQueue, task);
LOG("enqueue ret %d", ret);
pthread_mutex_unlock(&mutex);
return ret;
}
//收到命令,将任务入队
void *procRecvCmdThread(void *arg)
{
int ret;
while (1)
{
int nCmd = recvCmdFromPC();
// 这里处理需要应用逻辑命令:切换指令、关闭指令
if (nCmd == SWITCH_CMD || nCmd == CLOSE_CMD)
{
// 添加任务
ST_DEV_CONFIG *configRemain;
configRemain = mallocAndSetDevConfig(g_curChannelNoTmp, g_curDevChoiceTmp);
if (NULL == configRemain)
{
continue;
}
ST_TASK task;
if (nCmd == SWITCH_CMD)
{
task.function = openDevProcess;
}
else
{
task.function = closeDevProcess;
}
task.arg = configRemain;
ret = threadpoolAddTask(task);
if (ret != 0)
{
sendRespToPC(nCmd, ERR_SELECT_CHANNEL, g_curChannelNoTmp);
freeAndNULLDevConfig(&configRemain);
}
}
OsSleep(100);
// LOG("procRecvCmdThread while(1)");
}
}
// 线程取出并执行任务,任务执行完成需释放参数空间
static void* taskHandler(void* arg)
{
while(1)
{
ST_TASK *task;
pthread_mutex_lock(&mutex);
task = dequeue(&taskQueue);
if (NULL == task)
{
pthread_mutex_unlock(&mutex);
OsSleep(10);
continue;
}
pthread_mutex_unlock(&mutex);
LOG("dequeue OK");
task->function(task->arg);
free(task->arg);
}
}
//循环创建线程,并执行取出的任务
int threadpoolInit(void)
{
int i;
pthread_t threadID[MAX_THREADS_SIZE];
initializeQueue(&taskQueue);
for (i = 0; i < MAX_THREADS_SIZE; i++)
{
pthread_create(&threadID[i], NULL, taskHandler, NULL);
}
}