5

2 つのスレッドが同時に同じ関数を呼び出し、その関数がソケットを介してテキストを送信する UDP クライアントである場合はどうなるのだろうか。

以下のコードを考慮して、実行していますが、まだエラーは発生していません。スレッドが同じソース (関数、変数、IP、ポート) を同時に使用するため、クラッシュすることになっているのではないかと思いますが、どのようにソースを共有していますか? 以下のコードはマルチスレッドの間違った使用法であると想像できます。他のスレッドが使用していない関数のみをスレッドが使用するようにスレッドを使用する方法を説明していただけますか? 言い換えれば、どうすればスレッドセーフになるのでしょうか?

Linux での C コードの例として:

void *thread1_fcn();
void *thread2_fcn();
void msg_send(char *message);

int main(void){
    pthread_t thread1, thread2;
    pthread_create( &thread1, NULL, thread1_fcn,  NULL);
    pthread_create( &thread2, NULL, thread2_fcn,  NULL);
    while(1){}
    return 0;
}

void *thread1_fcn(){
    while(1){
        msg_send("hello");
        usleep(500);
    }
    pthread_exit(NULL);
}

void *thread2_fcn(){
    while(1){
        msg_send("world");
        usleep(500);
    }
    pthread_exit(NULL);
}

void msg_send(char message[]){
       struct sockaddr_in si_other;
       int s=0;
       char SRV_IP[16] = "192.168.000.002";

        s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
        memset((char *) &si_other, 0, sizeof(si_other));
        si_other.sin_family = AF_INET;
        si_other.sin_port = htons(12346);
        si_other.sin_addr.s_addr = htonl(INADDR_ANY);
        inet_aton(SRV_IP, &si_other.sin_addr);
        sendto(s, message, 1000, 0, &si_other, sizeof(si_other));
        close(s);
}
4

3 に答える 3

4

コードに問題はありません。各スレッドは、同じコードを実行する場合でも、個別のスタックを持っているため、個別の変数セットで動作します。変数は共有されません。

于 2013-06-26T21:08:47.443 に答える
3

内部でソケットを作成して閉じるのでmsg_send、特別なことは何も起こりません。すべてがうまくいきます。

于 2013-06-26T21:08:28.390 に答える