我正试图在C中创建一个简单的CLI音乐播放器。除了负责播放音乐的主线程之外,我还创建了第二个线程。第二个线程收到这样的参数(我尝试过使用和不使用volatile关键字(:
typedef struct AUDIO_S
{
volatile char audio_path[MAX_PATH];
volatile int play_state;
} audio_t;
主线程可以更新音频路径(当前文件(和播放状态(播放/暂停(。第二个线程的工作是检测这种变化,并通过更改、播放或暂停歌曲来采取相应的行动。
我有一个问题,(我认为(发生的是,第二个线程在主线程写入数据的同时读取这些数据,主线程正在产生混乱的输出。我尝试实现一个条件变量,但仍然得到了糟糕的输出。
这是我写数据的代码:
extern pthread_mutex_t mutex;
extern pthread_cond_t cond;
pthread_mutex_lock(&mutex);
strcpy(audio->audio_path, state->cur_play_dir);
strcat(audio->audio_path, "/");
strcat(audio->audio_path, state->cur_play_file);
audio->play_state = MUSIC_PLAY;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
这是我读到的代码:
extern pthread_mutex_t mutex;
extern pthread_cond_t cond;
while (1)
{
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond, &mutex);
char *new_audio_path = audio->audio_path;
if (strcmp(new_audio_path, cur_audio_path))
{
cur_audio_path = realloc(cur_audio_path,
strlen(new_audio_path) + 1);
strcpy(cur_audio_path, audio->audio_path);
printw("PATH: %sn", cur_audio_path);
}
pthread_mutex_unlock(&mutex);
}
互斥锁和条件被声明为全局变量,如下所示:
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
我对并行编程还很陌生,所以我怀疑我在做一些明显而愚蠢的事情。
在这个问题上睡了一觉之后,我意识到了自己的错误。事实证明,存储在路径字符串中的数据实际上根本没有问题。
在第二个线程中,我打印stdout路径的值纯粹是为了检查该值是否有效(所以我忘记了锁定任何内容(。然而,在主线程中,我还将其他数据打印到stdout。
当两个线程都写入stdout时,数据在打印时会出现混乱,而实际上存储在内存中的数据没有问题。我通过在第二个线程中写入文本文件来验证这一点,而第一个线程则写入stdout。写入文本文件的数据没有问题。