linux的多線程
java自己實現了線程庫,也就是說java的線程並不和操作系統的線程對應,jvm在操作系統上面是一個進程,當這個進程被操作系統調度到後,jvm內部實現的線程庫再調度java線程,為什麼是這樣呢?考慮到以前的操作系統內核,比如linux,在以前都不直接支持線程,用戶線程和內核線程是多對一的關系,solaris一度也是這樣,所以java當然心有餘而力不足了,你操作系統都不能完美支持線程,你讓我實現不是難為我嗎?在那個年代,java多線程的調度完全是自主的,操作系統根本不知道java是多線程的,調度策略完全自己實現,單cpu下肯定是分時的,多cpu下就看jvm會不會建立多cpu上的多jvm實例了。
到了後來,操作系統內核紛紛都支持了多線程(windows開始就支持),那麼java也要考慮推卸一些責任了,這樣java線程就和操作系統線程一一對應或多多對應了,這個時候,如果是一一對應,那麼線程的調度完全交給了操作系統內核,當然jvm還保留一些策略足以影響到其內部的線程調度,舉個例子,在linux下,只要一個Thread.run就會調用一個fork產生一個線程。
問:java獲得cup使用權採用的搶占機制,使用cup的時候是分時機制,這句話對不對?
答:部分對,早期實現,基本可以實現搶占式,但是現代實現,如果系統不支持搶占,那麼jvm也無所謂搶佔了。
問:多線程使用cup和使用的操作系統有關還是java機制有關(xp是什麼機制)
答:早期是java機制實現,現在大部分是操作系統實現的,java機制僅僅保留了相關策略從而影響調度;xp是基於優先順序的搶占式調度,其性能很大程度依賴於動態優先順序提升
⑵ linux多線程問題
這應該是生產者與消費者的模型。。
隊列操作的函數+mutex 互斥鎖
然後用阻塞方式獲取鎖就OK拉。。
⑶ linux多線程問題。
少了pthread_t t1,t2吧。
gcc file.c -o file -lpthread編譯. 運行結果:
線程--1
線程--2
線程--2
信號!
可以收到信號。你有什麼問題?
⑷ linux下多線程同步
你的問題不是互斥的問題,而是傳給子線程的 i 是指針,在子線程獲取 *arg 時,主線程的 for 循環可能已經修改或者沒有修改 i 的值,從而出現問題。下面的代碼直接把 i 的值傳給子線程,而不是傳指針,就不會有問題了。
#include<iostream>
usingnamespacestd;
#include<pthread.h>
#include<semaphore.h>
sem_tg_sem;
pthread_mutex_tg_mutex;
staticintg_count=0;
constintTHREAD_NUM=100;
void*ProcThread(void*arg)
{
longiNum=(long)arg;
sem_post(&g_sem);
pthread_mutex_lock(&g_mutex);
sleep(2);
g_count=g_count+1;
cout<<"childthreadnum="<<iNum<<",count="<<g_count<<endl;
pthread_mutex_unlock(&g_mutex);
pthread_exit(NULL);
returnNULL;
}
intmain(){
sem_init(&g_sem,0,1);
pthread_mutex_init(&g_mutex,NULL);
pthread_tchildThread[THREAD_NUM];
for(inti=0;i<THREAD_NUM;++i)
{
sem_wait(&g_sem);
intiRet=pthread_create(childThread+i,NULL,ProcThread,(void*)i);
if(iRet!=0)
{
cout<<"error="<<iRet<<endl;
}
}
for(inti=0;i<THREAD_NUM;++i)
{
pthread_join(childThread[i],NULL);
}
sem_destroy(&g_sem);
pthread_mutex_destroy(&g_mutex);
cout<<"!!!HelloWorld!!!"<<endl;//prints!!!HelloWorld!!!
return0;
}
⑸ Linux多線程編程,替代sleep的幾種方式
我只想要進程的某個線程休眠一段時間的,可是用sleep()是將整個進程都休眠的,這個可能就達不到,我們想要的效果了。 目前我知道有三種方式:
1 usleep
這個是輕量級的, 聽說能可一實現線程休眠, 我個人並不喜歡這種方式,所以我沒有驗證它的可行信(個人不推薦)。
2 select
這個可以,我也用過這種方式, 它是在輪詢。
3 pthread_cond_timedwait
採用pthread_cond_timedwait(pthread_cond_t* cond, pthread_mutex_t *mutex, const struct timespec *abstime)可以優雅的解決該問題,設置等待條件變數cond,如果超時,則返回;如果等待到條件變數cond,也返回。本文暫不將內部機理,僅演示一個demo。
首先,看這段代碼,thr_fn為一個線程函數:
#include <stdio.h>#include <stdlib.h>int flag = 1;void * thr_fn(void * arg) {while (flag){printf("******\n");sleep(10);}printf("sleep test thread exit\n");}int main() {pthread_t thread;if (0 != pthread_create(&thread, NULL, thr_fn, NULL)) {printf("error when create pthread,%d\n", errno);return 1;}char c ;while ((c = getchar()) != 'q');printf("Now terminate the thread!\n");flag = 0;printf("Wait for thread to exit\n");pthread_join(thread, NULL);printf("Bye\n");return 0;}
輸入q後,需要等線程從sleep中醒來(由掛起狀態變為運行狀態),即最壞情況要等10s,線程才會被join。採用sleep的缺點:不能及時喚醒線程。
採用pthread_cond_timedwait函數實現的如下:
#include <stdio.h>#include <sys/time.h>#include <unistd.h>#include <pthread.h>#include <errno.h>static pthread_t thread;static pthread_cond_t cond;static pthread_mutex_t mutex;static int flag = 1;void * thr_fn(void * arg) {struct timeval now;struct timespec outtime;pthread_mutex_lock(&mutex);while (flag) {printf("*****\n");gettimeofday(&now, NULL);outtime.tv_sec = now.tv_sec + 5;outtime.tv_nsec = now.tv_usec * 1000;pthread_cond_timedwait(&cond, &mutex, &outtime);}pthread_mutex_unlock(&mutex);printf("cond thread exit\n");}int main(void) {pthread_mutex_init(&mutex, NULL);pthread_cond_init(&cond, NULL);if (0 != pthread_create(&thread, NULL, thr_fn, NULL)) {printf("error when create pthread,%d\n", errno);return 1;}char c ;while ((c = getchar()) != 'q');printf("Now terminate the thread!\n");pthread_mutex_lock(&mutex);flag = 0;pthread_cond_signal(&cond);pthread_mutex_unlock(&mutex);printf("Wait for thread to exit\n");pthread_join(thread, NULL);printf("Bye\n");return 0;}
pthread_cond_timedwait()函數阻塞住調用該函數的線程,等待由cond指定的條件被觸發(pthread_cond_broadcast() or pthread_cond_signal())。
當pthread_cond_timedwait()被調用時,調用線程必須已經鎖住了mutex。函數pthread_cond_timedwait()會對mutex進行【解鎖和執行對條件的等待】(原子操作)。這里的原子意味著:解鎖和執行條件的等待是原則的,一體的。(In this case, atomically means with respect to the mutex andthe condition variable and other access by threads to those objectsthrough the pthread condition variable interfaces.)
如果等待條件滿足或超時,或線程被取消,調用線程需要在線程繼續執行前先自動鎖住mutex,如果沒有鎖住mutex,產生EPERM錯誤。即,該函數返回時,mutex已經被調用線程鎖住。
等待的時間通過abstime參數(絕對系統時間,過了該時刻就超時)指定,超時則返回ETIMEDOUT錯誤碼。開始等待後,等待時間不受系統時鍾改變的影響。
盡管時間通過秒和納秒指定,系統時間是毫秒粒度的。需要根據調度和優先順序原因,設置的時間長度應該比預想的時間要多或者少點。可以通過使用系統時鍾介面gettimeofday()獲得timeval結構體。
⑹ linux如何實現多線程
#/bin/bashall_num=10a=$(date +%H%M%S)for num in `seq 1 ${all_num}`do
sleep 1
echo ${num}
done
b=$(date +%H%M%S)
echo -e "startTime:\t$a"echo -e "endTime:\t$b"
⑺ linux下的多線程
thread_return指向某存儲線程返回值的變數。
倘若線程返回值是一個字元串。我們當然可以用一個指針void *thread_return 搞定。
但如果有多個返回值或者返回的是一個結構體,那麼void *thread_return就不能滿足需要了。所以需要用void **thread_return。
供參考,非權威解釋。
⑻ 關於linux下多線程編程
pthread_join 線程停止等待函數沒有調用
pthread_create 線程生成後,沒有等子線程停止,主線程就先停止了。
主線程停止後,整個程序停止,子線程在沒有printf的時候就被結束了。
結論:不是你沒有看到結果,而是在子線程printf("..................\n");之前整個程序就已經停止了。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#define FALSE -1
#define TRUE 0
void *shuchu( void *my )
{
int j;
printf("..................\n");
}
int main()
{
int i = 0;
int rc = 0;
int ret1;
pthread_t p_thread1;
if(0!=(ret1 = pthread_create(&p_thread1, NULL, shuchu, NULL)))printf("sfdfsdfi\n");
printf("[%d]\n",p_thread1);
pthread_join(p_thread1, NULL);
return TRUE;
}
⑼ linux線程如何運行
pthread_create執行後,如果執行成功會生成一個子線程 也就是現在有兩個線程同時運行
父線程還會繼續執行後面的代碼 直到結束
子線程則開始執行thread函數體里的代碼了 別的不執行
pthread_join會按照父線程執行順序 到它了就會執行 該函數的作用是阻塞等待一個線程執行完畢
在你的代碼里 不一定在子線程執行3次後才啟動 也可能子線程沒有執行呢 父線程就執行到pthread_join了 然後阻塞等待子線程
如果你想讓pthread_join在子線程3次執行後才啟動 可以讓父線程sleep下 不過子線程執行完了 你再執行pthread_join也就沒有什麼意義了
不懂再問
⑽ Linux下多線程的如何執行
主線程結束,則進程結束,屬於該進程的所有線程都會結束,可以在主線程中join,也可以在主線程中加死循環。