--- /dev/null
+#include <stdio.h>\r
+#include <stdlib.h>\r
+\r
+\r
+#include "xbt/xbt_os_thread.h"\r
+#include "xbt.h"\r
+#include "xbt/log.h"\r
+XBT_LOG_NEW_DEFAULT_CATEGORY(sem_basic,"Messages specific for this sem example");\r
+\r
+\r
+\r
+#define THREAD_THREADS_MAX ((unsigned int)10)\r
+\r
+/*\r
+ * the thread funtion.\r
+ */\r
+void*\r
+thread_routine(void* param);\r
+\r
+/* an entry of the table of threads */\r
+typedef struct s_thread_entry\r
+{\r
+ xbt_os_thread_t thread;\r
+ unsigned int thread_index; /* the index of the thread */\r
+}s_thread_entry_t,* thread_entry_t;\r
+\r
+\r
+static xbt_os_sem_t \r
+sem = NULL;\r
+\r
+static\r
+int value = 0;\r
+int\r
+main(int argc, char* argv[])\r
+{\r
+ s_thread_entry_t threads_table[THREAD_THREADS_MAX] = {0}; \r
+ unsigned int i,j;\r
+ int exit_code = 0;\r
+ \r
+ xbt_init(&argc,argv);\r
+ \r
+ sem = xbt_os_sem_init(1);\r
+ \r
+ i = 0;\r
+ \r
+ while(i < THREAD_THREADS_MAX)\r
+ {\r
+ threads_table[i].thread_index = i;\r
+\r
+ if(NULL == (threads_table[i].thread = xbt_os_thread_create("thread",thread_routine,&(threads_table[i].thread_index))))\r
+ break;\r
+ \r
+ i++;\r
+ }\r
+ \r
+ /* close the thread handles */\r
+ for(j = 0; j < THREAD_THREADS_MAX; j++)\r
+ xbt_os_thread_join(threads_table[j].thread,NULL);\r
+ \r
+ xbt_os_sem_destroy(sem);\r
+ \r
+ INFO1("sem_basic terminated with exit code %d (success)",EXIT_SUCCESS);\r
+\r
+ xbt_exit();\r
+ \r
+ return EXIT_SUCCESS;\r
+ \r
+}\r
+\r
+void*\r
+thread_routine(void* param)\r
+{\r
+ int thread_index = *((int*)param);\r
+ int exit_code = 0;\r
+ \r
+ xbt_os_sem_acquire(sem);\r
+ INFO1("Hello i'm the thread %d",thread_index);\r
+ value++;\r
+ INFO1("The new value of the global variable is %d, bye",value);\r
+ xbt_os_sem_release(sem);\r
+ \r
+ xbt_os_thread_exit(&exit_code);\r
+\r
+ return (void*)(NULL);\r
+}\r
+\r
+\r
+\r