生活随笔
收集整理的這篇文章主要介紹了
接口线程安全隐患
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
? ? 在很多第三方提供的接口中,有些會說明此接口是線程安全,正因為這樣的說明,會導致很多沒有經驗的程序員出現莫名其妙的錯誤,筆者現在以libmemcached的?memcached_pool_release() 和 memcached_pool_fetch()為例進行簡單的說明。
? ? 在libmemcached的官方文檔中,已經說明者兩個函數是線程安全的,在使用的過程中可能會出現如下的使用情況:
typedef struct memcached_server_tag
{memcached_pool_st *memc_svr_pool;
}memcached_server_t;memcached_server_t *create_memcached_server(const char *memc_server_config,size_t size)
{assert(memc_server_config);memcached_server_t *mem_svr = g_malloc(sizeof(memcached_server_t));if (NULL == mem_svr){ DPRINT(1,NULL,"g_malloc failed \n"); assert(mem_svr);return NULL;} mem_svr->memc_svr_pool = memcached_pool(memc_server_config,size);if (NULL == mem_svr->memc_svr_pool){ DPRINT(1,NULL,"create memcached server pool failed \n");assert(mem_svr->memc_svr_pool);g_free(mem_svr);return NULL;}return mem_svr;
}void destroy_memcached_server(memcached_server_t *memc_server)
{if (memc_server){memcached_pool_destroy(memc_server->memc_svr_pool);g_free(memc_server);}
}static int memc_pool_release(memcached_server_t *memc_server,memcached_st *mem_s)
{memcached_return_t rt = memcached_pool_release(memc_server->memc_svr_pool,mem_s);if (MEMCACHED_SUCCESS != rt){DPRINT(2,NULL,"memcached_pool_release. [%s]\n",memcached_strerror(mem_s,rt));return -1;}return 0;
}char * memcached_server_get(memcached_server_t *memc_server,const char *key,size_t key_length,size_t *value_length)
{assert(memc_server);assert(memc_server->memc_svr_pool);assert(key);assert(value_length);memcached_return_t rt;memcached_st *mem_s = memcached_pool_fetch(memc_server->memc_svr_pool,NULL,&rt);if (memcached_failed(rt)){DPRINT(2,NULL,"memcached_pool_fetch failed. [%s]\n",memcached_strerror(mem_s,rt));return NULL;}char *value = NULL;uint32_t flag;value = memcached_get(mem_s,key,key_length,value_length,&flag,&rt);if (memcached_failed(rt)){DPRINT(6,NULL,"memcached_get failed. [key : %s, reason : %s]\n",key,memcached_strerror(mem_s,rt));}memc_pool_release(memc_server,mem_s);return value; //remember: it must be free by caller
}
測試代碼:
host = "127.0.0.1:11220";
memcached_server_t *memcached_server = create_memcached_server(host,strlen(host));在多線程環境下執行:
thread1:memcached_server_get(memcached_server,key1,key1_size,&value_size);thread2memcached_server_get(memcached_server,key2,key2_size,&value_size);
? ? 以上的測試,有個線程獲取關鍵字的值可能會失敗。假如thread1正執行在69行代碼處(memcached_get),而此時thread2也進入memcached_server_get函數,如果thread2在執行memcached_pool_fetch時,thread1還沒有釋放資源(memc_pool_release),thread2將會在memcached_pool_fetch處執行失敗,從而導致整個程序的錯誤結果。
? ? 因此在理解這些線程安全的接口上的時候,需要萬分的注意。線程安全接口,使用的數據結構都是相互獨立的,所以我們可以用相互獨立的memcached_server_t結構指針,去代替全局的memcached_server。
轉載于:https://my.oschina.net/shaxunyeman/blog/135815
總結
以上是生活随笔為你收集整理的接口线程安全隐患的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。