2つのスレッドが同じ関数を同時に呼び出し、その関数がソケット上にテキストを送信するUDPクライアントである場合はどうなるのだろうか。複数のpthreadが同じ関数を使用するとどうなるか
以下のコードを考慮して、私はそれを実行していますが、私はまだエラーがありません。私はスレッドが同じソース(関数、変数、IP、ポート)を同時に使用し、ソースをどのように共有するのであろうとクラッシュするはずですか?私は、以下のコードはマルチスレッドの使い方が間違っていると思いますが、他のスレッドが使用していない関数をスレッドが使用するようにスレッドをどのように使うべきか説明できますか?言い換えれば、どのようにスレッドセーフなのでしょうか? Linux上の例のCコードとして
:あなたはmsg_send
内のソケットを作成し、閉じているので
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);
}
同じ機能を呼び出す際に問題はありません(各スレッドは独自の実行コンテキストとスタックを持っています)。 *共有状態へのアクセスに問題があるかもしれません(ライブラリ呼び出しにおける共有状態を含む)。もしあれば共有状態がどのようなものかを見極めるためにコードの自己分析を検討し、この問題に焦点を当てます。 – user2246674
自動変数の美しさは、自動的にすべてが機能することです。 –
'thread1_fcn()'と 'thread12_fcn()'は、 'pthread_create()'が予期しているものと一致する 'void *'引数を取るように宣言されるべきです。 – jxh