【发布时间】:2019-12-26 06:36:15
【问题描述】:
以下程序,我在其中使用临界区来保护写入者/读取者模式:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#define NAME_SIZE 6
#define NUM_THREADS 4
static char name[NAME_SIZE];
pthread_mutex_t mt;
pthread_cond_t read_phase;
void* name_joey(void *arg);
void* name_jimmy(void *arg);
void* name_leah(void *arg);
void* print_name(void *arg);
int main(void)
{
pthread_t joey;
pthread_t jimmy;
pthread_t leah;
pthread_t printer;
pthread_create(&joey, NULL, name_joey, NULL);
pthread_create(&jimmy, NULL, name_jimmy, NULL);
pthread_create(&leah, NULL, name_leah, NULL);
pthread_create(&printer, NULL, print_name, NULL);
pthread_join(joey, NULL);
pthread_join(jimmy, NULL);
pthread_join(leah, NULL);
pthread_join(printer, NULL);
return EXIT_SUCCESS;
}
void* name_joey(void *arg)
{
while(1)
{
pthread_mutex_lock(&mt);
memset(name, 0, NAME_SIZE);
strcpy(name, "Joey\0");
pthread_mutex_unlock(&mt);
}
return 0;
}
void* name_jimmy(void *arg)
{
while(1)
{
pthread_mutex_lock(&mt);
memset(name, 0, NAME_SIZE);
strcpy(name, "Jimmy\0");
pthread_mutex_unlock(&mt);
}
return 0;
}
void* name_leah(void *arg)
{
while(1)
{
pthread_mutex_lock(&mt);
memset(name, 0, NAME_SIZE);
strcpy(name, "Leah\0");
pthread_mutex_unlock(&mt);
}
return 0;
}
void* print_name(void *arg)
{
while(1)
{
pthread_mutex_lock(&mt);
printf("%s\n", name);
pthread_mutex_unlock(&mt);
sleep(1);
}
return 0;
}
对此输出产生变化:
Loey
Leah
Leah
Jimmy
Jimm
Joey
eah
Jimm
Jimmy
Loey
Leah
Loey
Jimmy
imm
Loey
Loeh
Jeey
Limm
Jimm
Jimmy
Leah
Leah
Jimmy
Jimmy
Jimm
Jeah
Loey
Jimmy
Jimmy
Jeah
这不是预期的效果。除了在每次写入之前完全清零内存之外,我还为代码的每个写入/读取区域提供了关键部分。是什么原因导致内存像这样部分畸形?
【问题讨论】:
标签: c multithreading concurrency synchronization pthreads