diff --git a/thread/1.hellothread_st.c b/thread/1.hellothread_st.c
new file mode 100644
index 0000000000000000000000000000000000000000..af0917c8dace83ef4824a683f4bd446919d2152b
--- /dev/null
+++ b/thread/1.hellothread_st.c
@@ -0,0 +1,45 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <pthread.h>
+
+int d1=10, d2;
+
+void * hello_thread(void *arg)
+{
+	int i=200;
+	
+	printf("Hello_Thread Start(d1:%d, d2:%d, i:%d)!!\n", d1,d2,i);
+	for(i=1; i<=(int)arg; i++) {
+		printf("Hello_Thread_%d!!\n", i);
+		d1++;
+		d2++;
+		sleep(1);
+	}
+	printf("Hello_Thread End(d1:%d, d2:%d, i:%d)!!\n", d1,d2,i);
+	//return arg;
+	pthread_exit(arg);
+}
+
+int main(void)
+{
+	pthread_t tid;
+	int status;
+	int i=100;
+	pthread_attr_t attr; //속성은 우리가 채우는 것이다. 값을 할당하고 넘기는 것이 의미가 있다.
+	
+	printf("Main_Thread Start(d1:%d, d2:%d, i:%d)!!\n", d1,d2,i);
+	status = pthread_create(&tid, NULL, hello_thread, (void*)15);//주소를 넘긴다. 속성을 받지 않을 거면 NULL. 
+	if(status != 0) {
+		perror("thread create");
+		exit(1);
+	}	
+	
+	for(i=1; i<=5; i++) {
+		printf("Main_Thread_%d!!\n", i);
+		sleep(1);
+	}
+	printf("Main_Thread End(d1:%d, d2:%d, i:%d)!!\n", d1,d2,i);
+	pthread_exit(NULL); //커널에게 내 메모리를 access하는 녀석이 있다면 메모리를 해지하지 말아라.
+    return 0;
+}
\ No newline at end of file
diff --git a/thread/2.mymutexthread_st.c b/thread/2.mymutexthread_st.c
new file mode 100644
index 0000000000000000000000000000000000000000..0b15b7e1721f7edb0f52494e49b6bd654c96351d
--- /dev/null
+++ b/thread/2.mymutexthread_st.c
@@ -0,0 +1,87 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <pthread.h>
+#include <sys/types.h>
+#include <errno.h>
+
+#include <unistd.h>
+#include <sys/syscall.h> 
+
+void * thread_function(void *);
+
+int Counter=0;
+#ifndef NOMUTEX
+.... mutex_id;
+#endif
+
+int main(void)
+{
+	pthread_t tid1, tid2;
+	void *thread_result;
+
+#ifndef NOMUTEX
+	if(________(&mutex_id, NULL) != 0){
+		perror("pthread_mutex_init");
+		exit(errno);
+	}
+#endif
+
+	if(_______(&tid1, NULL, thread_function, "thread1")!=0) {
+		perror("pthread_create");
+		exit(1);
+	}
+	
+	if(_______(&tid2, NULL, thread_function, "thread2")!=0) {
+		perror("pthread_create");
+		exit(1);
+	}
+	
+	if(_______(tid1, &thread_result)!=0) {
+		perror("pthread_join");
+		exit(1);
+	}
+	if(_______(tid2, &thread_result)!=0) {
+		perror("pthread_join");
+		exit(1);
+	}
+	
+#ifndef NOMUTEX
+	___________(&mutex_id);
+#endif
+
+	printf(" thread result : %s\n", (char *) thread_result);
+	return 0;
+}
+
+void * thread_function(void * arg)
+{
+	int temp;
+	int i, j;
+	char buffer[80];
+
+	printf("thread_function called\n");	
+	for(i=0; i<8; i++) {
+#ifndef NOMUTEX
+		_________(&mutex_id);
+#endif
+		sprintf(buffer, "%s: CountRelay: from %d to ", (char*)arg, Counter);
+		write(1, buffer, strlen(buffer));
+
+		temp=Counter;
+		temp = temp+1;
+// delay
+		for(j=0; j<5000000; j++);
+
+		Counter=temp;
+
+		sprintf(buffer, "%d\n", Counter);
+		write(1, buffer, strlen(buffer));
+		
+#ifndef NOMUTEX
+		__________(&mutex_id);
+#endif
+	}
+	// getchar();
+	_______("thread end");
+}