私は変数をスレッドに渡そうとしていましたが、2番目のスレッドが作成されても定数変数として作成されていても値は変わります。C - ローカルスレッド変数が共有されています
//for the first user
if (flag == 0) {
//store the socket
cl_sc[0] = client_sock_desc;
//set id
whichOne[0] = 0;
puts("Client accepted");
//second user ,same procedure
}
else if (flag == 1) {
cl_sc[1] = client_sock_desc;
whichOne[0] = 1;
puts("Client accepted");
}
//create thread and pass cl_sc as arguement
pthread_t sTcThread;
pthread_create(&sTcThread, NULL, server_to_client, (void*)whichOne);
そしてここで、実行の
void* server_to_client(void* socket_desc)
{
//make the arguement readable
const int* whichOne = (int*)socket_desc;
//one int for retrieved data and one for his socket
int retrieve, socket = cl_sc[whichOne[0]];
//chat buddy socket
int palsSocket;
//the actual data
char data[DATA_LENGTH];
//free the string
memset(data, 0, DATA_LENGTH);
for (;;) {
//set accordingly
if (whichOne[0] == 0) {
palsSocket = cl_sc[1];
}
else if (whichOne[0] == 1) {
palsSocket = cl_sc[0];
}
printf("Im %d to join my socket is %d and my pals socket is %d\n", whichOne[0], socket, palsSocket);
}
}
結果が
クライアントが自分のソケットに参加するイム0を受け入れスレッドimplimentationは4であると私の仲間ソケットが受け入れ0
クライアントであります私のソケットに参加するためのIm 1は5、私の仲間のソケットは4
しかし、瞬間スレッド0が、これは私のソケットが4であると私の仲間のソケットが1
に一定のwhichOneを変更する4
解決され参加すること
イム1をたまたま起動していますそのような答えとコメントのおかげで。それは共有メモリ領域上の点以来
whichOne
はなく、別のスレッドによって、あなたのサブルーチンの命令によって変更されていないことをint *whichOneImported = (int *) socket_desc; int whichOne = whichOneImported[0];
私はもう少し展示が "なぜ"に役立つかもしれないと思いますが、正解です。 – aruisdante
ポインタは定数ですが、実際の値ではありません。値を一定にする方法はありますか? –
あなたは 'forOne [3]'スロットを定義しましたが、使用していないと思います。 –