【问题标题】:Simulate send and receive using pthreads使用 pthread 模拟发送和接收
【发布时间】:2012-04-28 07:30:37
【问题描述】:

我正在尝试使用 pthread 模拟发送和接收功能。我确实实现了以下代码。但有时它会挂起或产生错误的结果。

int g_sender,g_receiver; //global variables to keep track of the sender and receiver
void send(double ** data,int sender,int receiver, int size[],int block_size){
    int i;
    pthread_mutex_lock(&lock);  
    for (i=0;i<size[0];i++)
            memcpy(sharedA[i],data[i],size[1]*block_size);
    g_sender = sender;
    g_receiver = receiver;
    sem_wait(&sem);
    pthread_mutex_unlock(&lock);

}

void receive(double ** data, int sender,int receiver, int size[],int block_size){
        int i;
    while(!(sender==g_sender && receiver==g_receiver));
    for(i=0;i<size[0];i++)
        memcpy(data[i],sharedA[i],size[1]*block_size);
    g_sender =-1;
    g_receiver = -1;
    sem_post(&sem);
}

你认为我在这里错过了什么?

谢谢

【问题讨论】:

    标签: c synchronization pthreads


    【解决方案1】:

    很多:)

    • 持有锁的目的是什么?
    • 在持有锁时从不等待信号量
    • 始终检查库函数的返回值。特别是 sem_ 函数是可中断的,您必须检查是否有 sem_wait 发生中断
    • 如果您对 POSIX 线程没有那么丰富的经验,请不要使用 sem_t。请改用互斥锁和条件变量。他们更高 更适合应用程序代码的级别接口。

    【讨论】:

    • 我正在使用锁来保护全局变量 sharedA、g_sender、g_receiver 不受其他线程的影响,直到从接收方读取它。我使用信号量来模拟阻塞发送。
    • @user504453,无论如何,你的设计对我来说没有多大意义
    猜你喜欢
    • 2018-06-26
    • 1970-01-01
    • 2011-05-18
    • 2015-05-06
    • 2017-06-29
    • 1970-01-01
    • 2013-11-13
    • 2012-04-09
    • 1970-01-01
    相关资源
    最近更新 更多