1. 程式人生 > >pthread_create回撥函式返回值

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則指向上面說到的回撥函式
start_rtn的返回值。
為了更直觀的理解,這裡給一個最簡單的例子:(Ubuntu14.04環境) test.c
#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