WebKit2010.04.18 07:19
pthread_create() 는 각 thread의 시작 함수에 하나의 argument를 넘길 수 있게 해 준다. 그런데 만일 넘기고자 하는 argument가 여러개라면, 이때는 모든 argument들을 포함하는 structure의 형태로 만들어서 포인터로 넘겨주면 된다.

또한 argument들은 참조 호출 형태로 넘겨져야 하며 (void* ) 로 cast되어야 한다.

Example 1)
이 예제는 간단한 integer 형의 변수값을 argument로 넘긴다.

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

#define NUM_THREADS 4

const char *messages[NUM_THREADS] = {"English: Hello World!", "French: Bonjour, le monde!",
 "Spanish: Hola al mundo", "German: Guten Tag, Welt!"};

void *PrintHello(void* threadID)
{
  int *idPtr, taskID;
  sleep(1);
  idPtr = (int* ) threadID;
  taskID = *idPtr;
  printf("Thread %d: %s\n", taskID, messages[taskID]);
  pthread_exit(NULL);
}

int main(int argc, char* argv[])
{
  pthread_t threads[NUM_THREADS];
  int taskIDs[NUM_THREADS];
  int rc, t;

  for (t = 0; t < NUM_THREADS; t++){
    taskIDs[t] = t;
    printf("Creating thread %d\n", t);
    rc = pthread_create(&threads[t], NULL, PrintHello, (void* )&taskIDs[t]);
    if (rc){
      printf("ERROR; return code from pthread_create() is %d\n", rc);
      exit(-1);
    }
  }
  pthread_exit(NULL);
}

Example 2)
다음은 여러개의 argument들을 structure로 어떻게 넘기는지 볼 수 있는 좋은 예제이다.
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

#define NUM_THREADS 4

const char *messages[NUM_THREADS] = {"English: Hello World!", "French: Bonjour, le monde!",
 "Spanish: Hola al mundo", "German: Guten Tag, Welt!"};


struct threadData
{
  int threadID;
  int sum;
  char* message;
};

struct threadData threadDataArray[NUM_THREADS];

void *PrintHello(void* arg)
{
  int taskID, sum;
  char* helloMsg;
  struct threadData *myData;

  sleep(1);
  myData = (struct threadData* ) arg;
  taskID = myData->threadID;
  sum = myData->sum;
  helloMsg = myData->message;

  printf("Thread %d: %s, Sum = %d\n", taskID, helloMsg, sum);
  pthread_exit(NULL);
}

int main(int argc, char* argv[])
{
  pthread_t threads[NUM_THREADS];
  int *taskIDs[NUM_THREADS];
  int rc, t, sum = 0;

  for (t = 0; t < NUM_THREADS; t++){
    sum += t;
    threadDataArray[t].threadID = t;
    threadDataArray[t].sum = sum;
    threadDataArray[t].message = (char* )messages[t];

    printf("Creating threads %d\n", t);

    rc = pthread_create(&threads[t], NULL, PrintHello, (void* )&threadDataArray[t]);
    if (rc){
      printf("ERROR; return code from pthread_create() is %d\n", rc);
      exit(-1);
    }
  }
  pthread_exit(NULL);
}

Example 3)
다음은 argument passing의 잘못 된 예이다. 코드를 보면 알겠지만 thread가 생성 될 때마다 argument의 변수 값이 계속 변하기 때문이다.

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

#define NUM_THREADS 4

void *PrintHello(void* threadID)
{
  int taskID;
  sleep(1);
  taskID = *threadID;
  printf("Hello from thread %d\n", taskID);
  pthread_exit(NULL);
}

int main(int argc, char* argv[])
{
  pthread_t threads[NUM_THREADS];
  int rc, t;

  for (t = 0; t < NUM_THREADS; t++){
    printf("Creating threads %d\n", t);

    rc = pthread_create(&threads[t], NULL, PrintHello, (void* )&t);
    if (rc){
      printf("ERROR; return code from pthread_create() is %d\n", rc);
      exit(-1);
    }
  }
  pthread_exit(NULL);
}


'Programming > POSIX Threads' 카테고리의 다른 글

thread에 arguments 넘기기  (1) 2010.03.26
Posted by exahz
WebKit2010.03.13 19:21
아래는 Ubuntu 공식 홈페이지의 문서에 나와있는 내용이다.


Get dependencies

WebKit requires a newer version of libsoup than provided by the official Ubuntu repositories. Add the PPA for WebKit Team repository to get access to the right version:

sudo add-apt-repository ppa:webkit-team
sudo apt-get update
sudo apt-get dist-upgrade

WebKit requires libraries to successfully aquire, configure, and compile. You can get libraries by issuing the following command in your terminal:

sudo apt-get install subversion gtk-doc-tools autoconf automake libtool libgtk2.0-dev libpango1.0-dev libicu-dev
libxslt-dev libsoup2.4-dev libsqlite3-dev gperf bison flex libjpeg62-dev libpng12-dev libxt-dev autotools-dev
libgstreamer-plugins-base0.10-dev libenchant-dev libgail-dev

Get the source code

To acquire the WebKit source code issue the following command in your terminal:

svn checkout http://svn.webkit.org/repository/webkit/trunk ~/src/WebKit

Be patient, this step will take some time.

Compile the code

Change the directory in your terminal to the newly created ~/src/WebKit directory with the following command:

cd ~/src/WebKit 

Now you will need to configure the source to be sure all dependencies are present on your system. Issue this simple command in your terminal:

./autogen.sh --prefix=/usr/WebKitBuild

If your ./autogen.sh command runs without any hitches you are ready to compile WebKit. Issue the following command
in your terminal and grab a beer: 
WebKitTools/Scripts/build-webkit --gtk --debug


To run the demo browser:
WebKitTools/Scripts/run-launcher --gtk --debug

'WebKit' 카테고리의 다른 글

Building WebKit (cairo-win32)  (0) 2010.04.26
WinLauncher  (0) 2010.04.18
WebKit, Apple's CFNET, CFURL.  (0) 2010.04.18
Building WebKit on GTK/Linux, Ubuntu 9.10  (0) 2010.03.13
Android 개발 환경 세팅 (Windows)  (0) 2010.01.23
WebKit 빌드 절차  (0) 2010.01.20
Posted by exahz

티스토리 툴바