當前位置:首頁 » 操作系統 » linuxcpthread

linuxcpthread

發布時間: 2023-02-02 18:04:27

『壹』 linux C線程崩潰的原因!!!

gcc xxx.c -lpthread 其中的-l是指包含的lib庫,具體寫法可以man gcc看下
多線程函數除了要包含頭文件pthread.h外還必須要包含lib庫pthread
pthread_create是創建線程,但具體的線程裡面做什麼事是在void *create(void *arg)里,這個函數名是自己任意區的,但返回值和參數一般都是void*類型,因為pthread_create函數的定義就是這樣
int pthread_create(pthread_t*restrict tidp,const pthread_attr_t *restrict_attr,void*(*start_rtn)(void*),void *restrict arg);

『貳』 Linux C 怎麼實現兩個線程同步讀取兩個內存的數據

在Linux系統中使用C/C++進行多線程編程時,我們遇到最多的就是對同一變數的多線程讀寫問題,大多情況下遇到這類問題都是通過鎖機制來處理,但這對程序的性能帶來了很大的影響,當然對於那些系統原生支持原子操作的數據類型來說,我們可以使用原子操作來處理,這能對程序的性能會得到一定的提高。那麼對於那些系統不支持原子操作的自定義數據類型,在不使用鎖的情況下如何做到線程安全呢?本文將從線程局部存儲方面,簡單講解處理這一類線程安全問題的方法。

一、數據類型
在C/C++程序中常存在全局變數、函數內定義的靜態變數以及局部變數,對於局部變數來說,其不存在線程安全問題,因此不在本文討論的范圍之內。全局變數和函數內定義的靜態變數,是同一進程中各個線程都可以訪問的共享變數,因此它們存在多線程讀寫問題。在一個線程中修改了變數中的內容,其他線程都能感知並且能讀取已更改過的內容,這對數據交換來說是非常快捷的,但是由於多線程的存在,對於同一個變數可能存在兩個或兩個以上的線程同時修改變數所在的內存內容,同時又存在多個線程在變數在修改的時去讀取該內存值,如果沒有使用相應的同步機制來保護該內存的話,那麼所讀取到的數據將是不可預知的,甚至可能導致程序崩潰。
如果需要在一個線程內部的各個函數調用都能訪問、但其它線程不能訪問的變數,這就需要新的機制來實現,我們稱之為Static memory local to a thread (線程局部靜態變數),同時也可稱之為線程特有數據(TSD: Thread-Specific Data)或者線程局部存儲(TLS: Thread-Local Storage)。這一類型的數據,在程序中每個線程都會分別維護一份變數的副本(),並且長期存在於該線程中,對此類變數的操作不影響其他線程。如下圖:

二、一次性初始化
在講解線程特有數據之前,先讓我們來了解一下一次性初始化。多線程程序有時有這樣的需求:不管創建多少個線程,有些數據的初始化只能發生一次。列如:在C++程序中某個類在整個進程的生命周期內只能存在一個實例對象,在多線程的情況下,為了能讓該對象能夠安全的初始化,一次性初始化機制就顯得尤為重要了。——在設計模式中這種實現常常被稱之為單例模式(Singleton)。Linux中提供了如下函數來實現一次性初始化:
#include <pthread.h>

// Returns 0 on success, or a positive error number on error
int pthread_once (pthread_once_t *once_control, void (*init) (void));
利用參數once_control的狀態,函數pthread_once()可以確保無論有多少個線程調用多少次該函數,也只會執行一次由init所指向的由調用者定義的函數。init所指向的函數沒有任何參數,形式如下:
void init (void)
{
// some variables initializtion in here
}
另外,參數once_control必須是pthread_once_t類型變數的指針,指向初始化為PTHRAD_ONCE_INIT的靜態變數。在C++0x以後提供了類似功能的函數std::call_once (),用法與該函數類似。使用實例請參考https://github.com/ApusApp/Swift/blob/master/swift/base/singleton.hpp實現。

『叄』 linux系統下,c語言pthread多線程編程傳參問題

3個線程使用的都是同一個info

代碼 Info_t *info= (Info_t *)malloc(sizeof(Info_t));只創建了一個info

pthread_create(&threads[i],NULL,calMatrix,(void *)info); 三個線程使用的是同一個

我把你的代碼改了下:

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>

intmtc[3]={0};//resultmatrix

typedefstruct
{
intprank;
int*mta;
int*mtb;
}Info_t;

void*calMatrix(void*arg)
{
inti;
Info_t*info=(Info_t*)arg;
intprank=info->prank;
fprintf(stdout,"calMatrix:prankis%d ",prank);

for(i=0;i<3;i++)
mtc[prank]+=info->mta[i]*info->mtb[i];

returnNULL;
}

intmain(intargc,char**argv)
{
inti,j,k=0;
intmta[3][3];
intmtb[3]={1};
Info_t*info=(Info_t*)malloc(sizeof(Info_t)*3);

for(i=0;i<3;i++)
for(j=0;j<3;j++)
mta[i][j]=k++;
/*3threads*/
pthread_t*threads=(pthread_t*)malloc(sizeof(pthread_t)*3);
fprintf(stdout," ");fflush(stdout);
for(i=0;i<3;i++)
{
info[i].prank=i;
info[i].mta=mta[i];
info[i].mtb=mtb;
pthread_create(&threads[i],NULL,calMatrix,(void*)(&info[i]));
}
for(i=0;i<3;i++)
pthread_join(threads[i],NULL);

fprintf(stdout," ====thematrixresult==== ");
fflush(stdout);

for(i=0;i<3;i++)
{
fprintf(stdout,"mtc[%d]=%d ",i,mtc[i]);
fflush(stdout);
}
return0;
}

矩陣的計算我忘記了,你運行看看結果對不對

『肆』 linux C語言進程

1、fork 是用來創建子進程的, 而不是線程( 線程創建需要用到 pthread_create )。
需要根據 fork() 的返回值來判斷下面的代碼是在父進程(返回pid>0)中還是子進程(返回0)中. 像上面的代碼中 if 中的代碼被在子進程中執行, else 中的代碼在父進程中執行。
2、常式:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
pid_t id; //定義一個進程號變數
int i=0;
printf("start fork/n");
id = fork(); //調用fork函數新建一個進程
i ++;
printf("end fork/n");
//判斷當前進程
if(id < 0){ //出錯
perror("fork failed/n");
exit(1);
}
else if(id == 0){ //子進程
printf("In child/n");
printf("i = %d/n", i++);
exit(0);
}
else{ //父進程
printf("In father/n");
printf("i = %d/n", i++);
exit(0);
}
return 0;
}
}
else if(WIFEXITED(status))
{
printf(");
while(((child=wait(&status))==-1)&(errno==EINTR));
exit(1).h>;Fork Error,strerror(errno));;*請解釋一下*/
if((child=fork())==-1)
{
printf("
#include<I am the child;
int main(int argc;n"n".h>:%d\,strerror(errno)).h>
printf(",getpid());1000000!status)
{
printf("n".h>
int status.h>;sys/;;errno;
exit(i);n"wait;,WEXITSTATUS(status)),child);
#include<*請解釋一下*/
if(child==-1)
{
printf("Child %d terminated normally return status is %d\
}
else if(;i<:%s\n"
i=5.h>,child;n"Child %d terminated e to signal %d znot caught\
printf("sys/I exit with%d\math;stdio;
#include<
printf("n"
#include<
}
else if(child==0)
{
int i=0;
}
/
}
else if(WIFSIGNALED(status))
{
printf("types:%s";unistd,i),char **argv)
{
pid_t child;
/Child %d terminated normally return status is zero\Wait Error;This will demostrate how to get the child status\
for(i=0;i++);
#include<,WTERMSIG(status));
}
return 0能不能幫忙解釋一下這段代碼中的一部分
#include<,child

『伍』 linux c編程中,使用pthread_create函數創建線程時,函數的第3個參數的是void

可以這樣聲明,但是在調用pthread_create函數的時候需要將線程函數的指針強制類型轉換成void *(pthread)(void*),否則編譯器會報錯。

熱點內容
電腦伺服器名稱怎麼查找 發布:2024-05-05 10:49:37 瀏覽:469
電腦連到代理伺服器 發布:2024-05-05 10:40:02 瀏覽:249
華為安卓手機如何投屏到雷克薩斯 發布:2024-05-05 10:37:50 瀏覽:210
微博上傳原圖 發布:2024-05-05 10:20:05 瀏覽:749
伺服器換電腦需要什麼東西 發布:2024-05-05 09:52:28 瀏覽:754
老算盤演算法 發布:2024-05-05 09:43:10 瀏覽:841
ps存儲顯示不含通道 發布:2024-05-05 09:32:35 瀏覽:103
如何用安卓做一個識物界面表 發布:2024-05-05 09:29:28 瀏覽:99
如何編譯linux內核模塊 發布:2024-05-05 09:27:25 瀏覽:169
為什麼apple驗證無法連接伺服器 發布:2024-05-05 09:20:35 瀏覽:661