第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用全局變量的線程問題

使用全局變量的線程問題

呼喚遠方 2021-04-06 17:18:18
我正在研究Linux和操作系統(tǒng)中使用的Thread。我在做些運動。目的是對一個全局變量的值求和,最后查看結果。當我期待最終的結果時,我的腦袋震撼了。代碼如下#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <pthread.h>int i = 5;void *sum(int *info);void *sum(int *info){    //int *calc = info (what happened?)    int calc = info;    i = i + calc;    return NULL;}int main(){    int rc = 0,status;    int x = 5;    pthread_t thread;    pthread_t tid;    pthread_attr_t attr;    pthread_attr_init(&attr);    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);    rc = pthread_create(&thread, &attr, &sum, (void*)x);    if (rc)     {                      printf("ERROR; return code from pthread_create() is %d\n", rc);        exit(-1);    }    rc = pthread_join(thread, (void **) &status);    if (rc)     {        printf("ERROR; return code from pthread_join() is %d\n", rc);        exit(-1);    }    printf("FINAL:\nValue of i = %d\n",i);    pthread_attr_destroy(&attr);    pthread_exit(NULL);    return 0;}如果我將變量calc作為int * cal放在sum函數(shù)中,則i的最終值為25(而不是期望值)。但是,如果我將其作為int calc表示,則i的最終值是10(此練習中的期望值)。當我將變量calc設置為int * calc時,我不知道i的值為25。
查看完整描述

2 回答

?
胡說叔叔

TA貢獻1804條經驗 獲得超8個贊

這個問題與線程或全局變量無關,與C的指針算術有關。


您可以使用以下代碼獲得完全相同的結果:


int main()

{

    int i = 5;

    int *j = 5;

    i = i + j;

    printf("%d\n", i); // this is 25

}

這里發(fā)生的是,您將指針j分配給值5,并對該指針“加5”。向指針添加5等同于在內存中添加足夠的空間來容納該指針指向的5個對象。在這種情況下,sizeof(int)為4,因此您實際上要添加4 * 5,即20。因此,結果為25,即5 + 4 * 5 = 25。


另一個警告是,由于sizeof(int)與機器有關,因此您的結果可能會有所不同。


讓我再舉一個例子,使這一點更加清楚:


int main()

{

    int i = 5;

    uint64_t *j = 5;

    i = i + j;

    printf("%d\n", i); // result is 45

}

由于sizeof(uint64_t)為8,這等效于將5 * 8加上原始值5,因此結果為5 + 5 * 8 = 45。


此代碼演示了類型轉換的許多問題。首先將“ x”聲明為“ int”,轉換為通用指針“ void *”,然后隱式轉換為“ int *”,然后轉換回“ int”。正如您已經在此處顯示的那樣,這些類型的投射肯定會讓您腳踩到腳。


查看完整回答
反對 回復 2021-04-16
  • 2 回答
  • 0 關注
  • 410 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號