我正在用C编写一个程序,其中有多个线程同时运行,并且它必须支持带有rwlocks或互斥锁的解决方案,具体取决于您定义的内容。这里的问题有时是当收到命令时,sscanf返回3(令牌)而不是预期的2,并且当我执行printf命令时,它与sscanf中解析的字符串不同,正如您在代码和输出中所看到的那样下面。预先感谢您的帮助!
我已经尝试过每次删除命令并将其初始化为全0时,将vectorCommands的字符串的memset()设置为0。现在我不知道下一步该怎么做,我一无所知。 WAIT_SEM,WR_LOCK等只是sem_wait,sem_post,pthread_mutex_lock和具有错误检查的解锁功能。
main.c
void insertCommand(char* data) {
WAIT_SEM(productor);
WR_LOCK(lockCommandVector);
memset(inputCommands[productorIndex],MAX_INPUT_SIZE);
strcpy(inputCommands[productorIndex++],data);
if(productorIndex >= MAX_COMMANDS) productorIndex = 0;
POST_SEM(consumers);
UNLOCK(lockCommandVector);
}
char* removeCommand() {
WAIT_SEM(consumers);
WR_LOCK(lockCommandVector);
char* command;
command = inputCommands[consumerIndex++];
if(consumerIndex >= MAX_COMMANDS) consumerIndex = 0;
if(strcmp(command,"x") == 0){ /* terminate consumer threads */
memset(inputCommands[consumerIndex],MAX_INPUT_SIZE);
strcpy(inputCommands[consumerIndex],"x");
POST_SEM(consumers);
return(command);
}
POST_SEM(productor);
if(command) return command;
return NULL;
}
void* applyCommands(void* args){
while(1){
const char* command = removeCommand();
char token;
char name[MAX_INPUT_SIZE];
char new_name[MAX_INPUT_SIZE];
int numTokens = sscanf(command,"%c %s %s",&token,name,new_name);
if(!(token == 'r' && numTokens == 3) && !(token == 'x' && numTokens == 1) && numTokens != 2){
printf("%d ",strcmp(new_name,""));
printf("%d %c %s %s %s",numTokens,token,new_name,command);
fprintf(stderr,"Error: invalid command in Queue\n");
exit(EXIT_FAILURE);
}
applycommands错误中的printf()的输出:
1- 错误:队列中的命令无效 0 3 l鼻烟d鼻烟
2- 错误:队列中的命令无效 0 3 l mart架c
等