Linuxマルチスレッド-読者ライターの質問
読者の質問
これも非常に古典的なマルチスレッドのテーマで、テーマの大意は以下の通りです:1人の書く者は多くの読者があって、複数の読者は同時にファイルを読むことができて、しかし書く者はファイルを書く時に読者がファイルを読むことを許さないで、同様に読者が読む時書く者も書くことができません.
プログラム:
これも非常に古典的なマルチスレッドのテーマで、テーマの大意は以下の通りです:1人の書く者は多くの読者があって、複数の読者は同時にファイルを読むことができて、しかし書く者はファイルを書く時に読者がファイルを読むことを許さないで、同様に読者が読む時書く者も書くことができません.
プログラム:
// reader_writer.cpp
//////////////////////////////////////////////////////////////////////
//
// , , ,
// 。
//////////////////////////////////////////////////////////////////////
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
//
class data
{
public:
data(int i, float f):
I(i), F(f)
{}
int I;
float F;
};
//
data *p_data = NULL;
pthread_rwlock_t lock;
//
const int WRITER_NUMBER = 2;
void *reader(void *arg);
void *writer(void *arg);
int main(int argc, char **argv)
{
pthread_t reader_tid;
pthread_t writer_tid[WRITER_NUMBER];
pthread_create(&reader_tid, NULL, reader, NULL);
for (int i = 0; i < WRITER_NUMBER; ++i)
{
pthread_create(&writer_tid[i], NULL, writer, (void *)i);
}
sleep(1);
return 0;
}
void *reader(void *arg)
{
int id = (int)arg;
pthread_detach(pthread_self());
while (true)
{
pthread_rwlock_rdlock(&lock);
printf("reader %d is reading the data; ", id);
if (p_data == NULL)
{
printf("the data is NULL
");
}
else
{
printf("the data is (%d, %f)
", p_data->I, p_data->F);
}
pthread_rwlock_unlock(&lock);
}
return (void *)0;
}
void *writer(void *arg)
{
pthread_detach(pthread_self());
while (true)
{
pthread_rwlock_wrlock(&lock);
printf("writer is writing the data; ");
if (p_data == NULL)
{
p_data = new data(1, 1.1f);
printf("writer create the data (%d, %f)
", p_data->I, p_data->F);
}
else
{
delete p_data;
p_data = NULL;
printf("writer free the data
");
}
pthread_rwlock_unlock(&lock);
}
return (void *)0;
}