pthread_create回撥函式返回值
Linux平臺中通過POSIX介面建立執行緒函式為:
#include <pthread.h>
int pthread_create(pthread_t *restrict tidp,
const pthread_attr_t *restrict attr,
void *(*start_rtn)(void *),
void *restrict arg);
想必大家對這個函式已經很熟悉了,這裡就不多講,這裡主要講一下start_rtn這個回撥函式的返回值問題。start_rtn的入參為 arg 。返回值為 void* 型別。因為之前不曾關心這個回撥函式的返回值問題,所以也一直在回撥函式末尾寫一句 return NULL。最近需要用到回撥函式的返回值來做一些處理,所以這裡也就記錄一下。 我們知道執行緒建立執行是預設非同步的過程(通過os排程什麼時候建立、執行)。所以為了在呼叫執行緒中做同步,獲取執行緒的的執行結果,需要主執行緒中使用另一個介面來獲取這個結果:
#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
這裡的 retval可以為NULL,如果為NULL則不關心子執行緒執行結果,如果不是NULL則指向上面說到的回撥函式#include <stdio.h> #include <pthread.h> void *cb_fn(void *arg)//執行緒回撥函式 { printf("in cb_fn\n"); return (void*)"OK"; } int main() { int ret; void *retval; pthread_t pid; ret = pthread_create(&pid, NULL, cb_fn, NULL); if(ret<0) { printf("pthread_create error,ret=%d\n",ret); return -1; } pthread_join(pid,&retval); printf("retval = %s\n",(char*)retval); return 0; }
編譯命令:
gcc test.c -lpthread
執行命令和結果:
#./a.out
in cb_fn
retval = OK
相信大家看到這裡已經一目瞭然了,使用void*作為返回值,也表明這個返回值可以返回任何型別的資料,這樣我們可以將需要的執行緒執行結果和狀態放到返回值中,然後主執行緒就可以通過pthread_join來獲取到然後做出相應的處理了。
ps:
pthread_join不光可以用來獲取到子執行緒的退出結果狀態,還將起到一個回收執行緒資源的作用。
有三種回收執行緒資源的方式:
1,主執行緒中使用pthread_join,如果不關心子程序執行結果,第二個引數用NULL。
2,子執行緒回撥函式中開頭處呼叫pthread_detach(pthread_self())。
3,主執行緒建立執行緒前設定detach屬性,使用pthread_attr_setdetachstate,這樣會多寫兩行程式碼:
pthread_attr_t attr;
pthread_t pid;
pthread_attr_init (&attr);
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&pid, &attr,thread_callback, thread_arg);
如有不對的地方,還請網友提出指教,謝謝!相關推薦
pthread_create回撥函式返回值
Linux平臺中通過POSIX介面建立執行緒函式為: #include <pthread.h> int pthread_create(pthread_t *restrict tidp, const p
獲取$.post $.get回撥函式返回值問題
專案中用Jquery操作,肯定避免不了向伺服器傳送請求,所以就會用到上面的兩個函式。完整的函式格式如下: ?$.get(URL,callback); ?$.post(URL,data,callback); 而某些時候我們要用callback回撥函式處理完以後的返回值
用谷歌的AsyncHttpClient簡單模仿安卓的AsyncHttpClient,實現非同步請求回撥函式返回值
實現思路 既然要呼叫Future.get() 才能激發訪問,那麼就想到了使用一個執行緒去訪問。我們就不需要等待阻塞了。 模仿安卓的AsyncHttpClient回撥。根據狀態回撥不同的函式。 實現的效果 執行程式碼...
自定義回撥函式傳遞值
回撥函式是一段可執行的程式碼段,它作為一個引數傳遞給其他的程式碼,其作用是在需要的時候方便呼叫這段(回撥函式)程式碼。 回撥函式 ? 1
【JS】關於for迴圈中的click回撥函式索引值錯誤的思考
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=dev
ajax回撥函式 返回404
先貼程式碼: JS程式碼如下。 PProductComposing.searchUp = function() { var _id = "#pProductComposing_type"; var url = $('#ctx').val()+"/pages/pProdu
nodejs request模組使用promise 返回回撥函式中的值
var request = require('request'); //exports.httprequest = (requestData) =>{ function httprequest(requestData){ return new Promise((resolve, rejec
關於jquery ajax請求發了,返回值也有,但是卻無法進去ajax的success回撥函式
這幾天在除錯專案中發現了jquery ajax出現了,請求發了,用chorme的network 發現請求也成功了,最後發現沒有進入ajax的success回撥函式,這個問題經我除錯發現
Node.js 回撥函式來解決SQL語句與返回值的非同步問題
作為一個剛剛接觸Node的菜鳥,面對Node的非同步問題著實是頭大。最近做一個前端的分頁問題,原始碼是順序執行兩條sql語句然後返回: client.query( //第一個sql 'SELECT * FROM products' ,
Thread 多執行緒 等待 回撥函式 獲取返回值
Thread 是1.1版本時候的執行緒 它預設是前臺執行緒 前臺執行緒:程序關閉後,執行緒還會執行完 無引數多執行緒 Console.WriteLine("主執行緒開始");
回撥函式的返回值給全域性變數的賦值問題
今天遇到一個問題,在js中,回撥函式的返回值對全域性變數進行賦值,網上的解決方案主要是把非同步改為同步 async: false,好記性不如爛筆頭來記錄一下。 原始碼如下: $('#loginSubmit').click
JS為變速移動新增任意多個屬性值包括回撥函式
//封裝新增任意多個屬性的函式 //fn這個引數是為這個函式新增的回撥函式 function changeAll(ele,json,fn){ //每次都清除一次定時器 clearInterval(ele.timed); //設定定時器 ele.timed=se
javascript--函式基礎(函式的定義/作用域,回撥函式,即時函式,內部(私有)函式,返回函式的函式,重寫自己的函式)
函式源於數學對映運算,它定義了一種關係,這種關係使一個集合裡的每一個元素對應到另一個(可能相同的)集合裡的唯一元素 javascript中: 函式是程式碼塊,一段被封閉嚴實的程式碼塊 函式是資料:使用者可以把函式作為 值 賦值給 變數 函式是一種物件,它是一類抽象類(建構函式),所有
SpringMVC在處理Ajax請求後返回void導致前臺Ajax回撥函式不執行
問題簡述 在一次SpringMVC專案中,前臺通過Ajax請求,準備修改資料庫中的資料。因為Ajax請求只是讓後臺更改資料,所以Controller方法根本不需要返回給前臺任何資料,所以我們將Controller的方法的返回值設定為void。但令我困擾的是,前端頁面本應該執行的回撥函式一直不
回撥函式及返回Json的三種方法
回撥函式及返回Json的三種方法 1.回撥函式: onreadystatechange 事件 當請求被髮送到伺服器時,我們需要執行一些基於響應的任務。 每當 readyState 改變時,就會觸發 onreadystatechange 事件。 readyState 屬性存有
函式指標和賦值 回撥函式
問:先定義了個函式: int function(int a, int b) { .......... } main函式裡面有個函式指標 問題1:那麼下面兩種對函式指標的賦值哪個是正確的,還是都可以? int main(void) { A: in
jsonp跨域中後臺返回的不是回撥函式形式
在常用的jsonp跨域請求時後臺返回的是一個回撥函式,然而當後臺傳的不是以函式形式返回的,實際返回的是一個變數,那麼原生js封裝的jsonp就不能使用了,那麼我們該如何拿到後臺傳過來的資料呢?其實原理不變,我們依然是利用script標籤的src屬性沒有跨域限制,在這個標籤裡
關於ajax請求返回json資料不進入回撥函式的可能情況
最近做一個專案,一般都是用json資料先模擬後端返回資料,結果昨天正常傳送一個get請求後,json資料請求正常,但是一直都沒法進入success回撥執行後續方法,搗鼓了很久,才發現get請求返回的json資料格式有問題,由於是自己模擬json資料,粗心導致少了一個標點符號
使用@ResponseBody返回String物件無法觸發ajax回撥函式
莫名其妙!!!!!!! 用@ResponseBody返回一個String物件無法觸發前臺回撥函式,而且你確定你程式碼沒有問題 如果你前臺的ajax中寫了dataType:"json"屬性,把它去掉 就可以了。。。。。。。
jQuery $.post()返回型別為json時不進入回撥函式的原因及解決方法
$.post()格式如下: $.post(url,data,success(data, textStatus, jqXHR),dataType) 引數描述 url 必需。規定把請求傳送到哪個 URL。 data 可選。對映或字串值。基本是json格式。 s