1. 程式人生 > >執行緒間的記憶體共享問題----你弄懂了嗎?

執行緒間的記憶體共享問題----你弄懂了嗎?

對執行緒間共享記憶體的問題,許多同學是不是都覺得很簡單?就是用全域性變數來共享碼,然而你說的並沒有什麼卵用…….(^__^)…….
對於執行緒間記憶體關係不弄得清清楚楚,很難寫好多執行緒程式。最簡練而精準的話來形容執行緒間共享記憶體:同一個執行緒組內執行緒間共享虛擬記憶體(自己通過實驗總結的,然而不久以後發現一本書中(linux裝置驅動程式)早就說過了,我讀書好少啊O(∩_∩)O哈哈~)
虛擬記憶體沒弄懂,就看看相關資料吧,今天我給的是兩個程式。
1.用一個執行緒改變另一個執行緒的棧記憶體資料
2.用一個執行緒改變另一個執行緒申請的堆記憶體資料
通過這兩個例子就能看出,這兩個執行緒間的記憶體,指標是共享的,怎麼簡練的描述這個共享呢,兩個執行緒間的有效指標,是可以彼此相互使用,並訪問的!
示例1

#include<pthread.h>
#include<unistd.h>
#include<iostream>
#include<syscall.h>
#include<string.h>

using namespace std;

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

void * foo(void *pBuffer)
{
   pthread_mutex_lock(&mutex);
   strcpy
((char*)pBuffer,"hello");//主執行緒的棧資料在此被修改 pthread_mutex_unlock(&mutex); pthread_cond_signal(&cond); } int main(int n, char *arg[]) { char Buffer[20]; //主執行緒的棧資料 pthread_t pthread_id1; pthread_create(&pthread_id1,NULL,foo,(void *)Buffer); pthread_mutex_lock(&mutex); pthread_cond_wait(&cond,&mutex);//注意pthread_cond_wait()的使用方法
pthread_mutex_unlock(&mutex); cout<<Buffer<<endl;// 輸出資料Buffer到標準輸出 return 0; }

示例2

#include<pthread.h>
#include<unistd.h>
#include<iostream>
#include<syscall.h>
#include<string.h>

using namespace std;

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

void * foo(void *pBuffer)
{
   pthread_mutex_lock(&mutex);
   strcpy((char*)pBuffer,"hello");//主執行緒的堆資料在此被修改
   pthread_mutex_unlock(&mutex);
   pthread_cond_signal(&cond);

}
int main(int n, char *arg[])
{
   char *Buffer = new char[20]; //主執行緒的堆資料
   pthread_t pthread_id1;
   pthread_create(&pthread_id1,NULL,foo,(void *)Buffer);
   pthread_mutex_lock(&mutex);
   pthread_cond_wait(&cond,&mutex);//注意pthread_cond_wait()的使用方法
   pthread_mutex_unlock(&mutex);
   cout<<Buffer<<endl;// 輸出資料Buffer到標準輸出
   return 0;
}