【问题标题】:Handling Multiple read and Single writes处理多读和单写
【发布时间】:2016-10-08 11:17:54
【问题描述】:

我对这个话题很陌生。每当我尝试一个接一个地完成一个进程时,都会感到困惑,下一个进程会在执行第一个进程之前启动。

例如:我正在从共享内存中读取,我希望下一个 write 进程等到 read 结束。但是在读取了某些部分之后,写入过程会进入并更改值。

我尝试使用 mutex 和 cond_wait 进行编码。也许有一些错误,或者我真的不知道 cond_wait 是如何正常工作的。需要帮助

我的代码 sn-p:

void create_reader()
{
    pthread_mutex_lock(&mutex);
    if (0 == fork()) {
        reader();
        exit(0);
    }
    readerID++;
    r+=1;

    pthread_cond_signal(&condition);
    pthread_mutex_unlock(&mutex);
}

void create_writer()
{
    pthread_mutex_lock(&mutex);

    while (!r)
    {
        cout<<"waiting"<<endl;
        pthread_cond_wait(&condition,&mutex);
    }

    if (0 == fork()) {
        writer();
        exit(0);
    }

    pthread_mutex_unlock(&mutex);
    writerID++;
}

【问题讨论】:

    标签: c++ multithreading pthreads shared-memory


    【解决方案1】:

    由于fork()会创建一个正在运行的进程的副本,如果写者在第二个进程中改变了内存,读者将永远看不到自己的内存修改:

    • 线程共享内存
    • 进程不会(除非您与 mmap 共享内存)

    也就是说,您的其他 pthread 函数调用似乎是正确的。

    http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them

    【讨论】:

    • 我使用的是 mmap,但作者不会等到读取完成。这就是我弄错了
    猜你喜欢
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 2020-06-15
    • 2021-05-23
    • 1970-01-01
    相关资源
    最近更新 更多