import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
final String regex = "\\d+(.*)";
final String string = "/*\n"
+ " * To change this license header, choose License Headers in Project Properties.\n"
+ " * To change this template file, choose Tools | Templates\n"
+ " * and open the template in the editor.\n"
+ " */\n\n"
+ "6 #include <stdio.h>\n"
+ "7 #include <sys/types.h>\n"
+ "8 #include <string.h>\n"
+ "9 #include <errno.h>\n"
+ "10 #include <sys/stat.h>\n"
+ "11 #include <fcntl.h>\n"
+ "12 #include <sys/mman.h>\n"
+ "13 #include <semaphore.h>\n"
+ "14 #include <sys/signal.h>\n"
+ "15 #include <signal.h>\n"
+ "16 #include <dirent.h>\n"
+ "17 #include <sys/stat.h>\n"
+ "18 #include <sys/wait.h>\n"
+ "19 #include <pthread.h>\n"
+ "20\n"
+ "21 #define BUFSIZE 10\n"
+ "22 #define TCOUNT 10\n"
+ "23 #define ITEMS 10000\n"
+ "24\n"
+ "25\n"
+ "26 struct item {\n"
+ "27 int value; // produced value\n"
+ "28 int source; // index of producer\n"
+ "29 };\n"
+ "30\n"
+ "31 struct buffer {\n"
+ "32 int count;\n"
+ "33 int in;\n"
+ "34 int out;\n"
+ "35 struct item data[BUFSIZE];\n"
+ "36 pthread_mutex_t mutex;\n"
+ "37 pthread_cond_t xp; // producer will wait for a slot using this\n"
+ "38 pthread_cond_t xc; // consumer fill wait for an item using this\n"
+ "39 };\n"
+ "40\n"
+ "41\n"
+ "42 struct buffer *buf; // shared bounded buffer\n"
+ "43\n"
+ "44 static void *\n"
+ "45 producer_thread(void *arg)\n"
+ "46 {\n"
+ "47\n"
+ "48 int index; // thread index\n"
+ "49 int i = 0;\n"
+ "50\n"
+ "51 index = (int) arg;\n"
+ "52\n"
+ "53 for (i = 0; i < ITEMS; ++i) {\n"
+ "54\n"
+ "55 // value of i is the item produced\n"
+ "56\n"
+ "57 pthread_mutex_lock(&buf->mutex);\n"
+ "58 while (buf->count == BUFSIZE)\n"
+ "59 pthread_cond_wait(&buf->xp, &buf->mutex);\n"
+ "60 // sleeps in this loop as long as buffer is full\n"
+ "61\n"
+ "7.1. POSIX NAMED SEMAPHORES 117\n"
+ "62\n"
+ "63 // put the item into buffer\n"
+ "64 buf->data[buf->in].value = i;\n"
+ "65 buf->data[buf->in].source = index;\n"
+ "66 buf->in = (buf->in + 1) % BUFSIZE;\n"
+ "67 buf->count++;\n"
+ "68\n"
+ "69 if (buf->count == 1)\n"
+ "70 pthread_cond_signal(&buf->xc);\n"
+ "71\n"
+ "72 pthread_mutex_unlock(&buf->mutex);\n"
+ "73\n"
+ "74 }\n"
+ "75\n"
+ "76 pthread_exit (NULL);\n"
+ "77 }\n"
+ "78\n"
+ "79\n"
+ "80\n"
+ "81 static void *\n"
+ "82 consumer_thread(void *arg)\n"
+ "83 {\n"
+ "84 int n = 0;\n"
+ "85 int x;\n"
+ "86 int s;\n"
+ "87\n"
+ "88 while (1) {\n"
+ "89 pthread_mutex_lock(&buf->mutex);\n"
+ "90\n"
+ "91 while (buf->count == 0)\n"
+ "92 pthread_cond_wait(&buf->xc, &buf->mutex);\n"
+ "93 // sleeps in this loop as long as buffer is empty\n"
+ "94\n"
+ "95\n"
+ "96\n"
+ "97 // retrive an item from buffer\n"
+ "98 x = buf->data[buf->out].value;\n"
+ "99 s = buf->data[buf->out].source;\n"
+ "100 buf->out = (buf->out + 1) % BUFSIZE;\n"
+ "101 buf->count--;\n"
+ "102\n"
+ "103 if (buf->count == (BUFSIZE - 1)) {\n"
+ "104 // wake up all possible workers;\n"
+ "105 // otherwise some workers will always sleep\n"
+ "106 pthread_cond_broadcast (&buf->xp);\n"
+ "107 }\n"
+ "108\n"
+ "109 pthread_mutex_unlock(&buf->mutex);\n"
+ "110\n"
+ "111 n++;\n"
+ "112\n"
+ "113 if (n == (TCOUNT * ITEMS))\n"
+ "114 break;\n"
+ "115 }\n"
+ "116\n"
+ "117 printf (\"retrieved %d items\\n\", n);\n"
+ "118 CHAPTER 7. SYNCHRONIZATION\n"
+ "118\n"
+ "119 printf (\"consumer finished successfully\\n\");\n"
+ "120\n"
+ "121 pthread_exit (NULL);\n"
+ "122 }\n"
+ "123\n"
+ "124\n"
+ "125 int\n"
+ "126 main(int argc, char **argv)\n"
+ "127 {\n"
+ "128\n"
+ "129 pthread_t pids[TCOUNT]; // producer tids\n"
+ "130 pthread_t ctid; // consumer tid\n"
+ "131 int i;\n"
+ "132 int ret;\n"
+ "133\n"
+ "134\n"
+ "135 buf = (struct buffer *) malloc(sizeof (struct buffer));\n"
+ "136 buf->count = 0;\n"
+ "137 buf->in = 0;\n"
+ "138 buf->out = 0;\n"
+ "139 pthread_mutex_init(&buf->mutex, NULL);\n"
+ "140 pthread_cond_init(&buf->xp, NULL);\n"
+ "141 pthread_cond_init(&buf->xc, NULL);\n"
+ "142\n"
+ "143\n"
+ "144 // create producer threads\n"
+ "145 for (i = 0; i < TCOUNT; ++i) {\n"
+ "146 ret = pthread_create(&pids[i], NULL, producer_thread,\n"
+ "147 (void *) i);\n"
+ "148 if (ret < 0) {\n"
+ "149 perror(\"thread create failed\\n\");\n"
+ "150 exit(1);\n"
+ "151 }\n"
+ "152 }\n"
+ "153\n"
+ "154\n"
+ "155 // create consumer thread\n"
+ "156 ret = pthread_create(&ctid, NULL, consumer_thread, (void *) NULL);\n"
+ "157 if (ret < 0) {\n"
+ "158 perror(\"thread create failed\\n\");\n"
+ "159 exit(1);\n"
+ "160 }\n"
+ "161\n"
+ "162\n"
+ "163 // wait for the producer threads to terminate\n"
+ "164 for (i = 0; i < TCOUNT; ++i)\n"
+ "165 pthread_join(pids[i], NULL);\n"
+ "166\n"
+ "167 // wait for the consumer thread to terminate\n"
+ "168 pthread_join(ctid, NULL);\n"
+ "169\n"
+ "170 free(buf);\n"
+ "171\n"
+ "172 pthread_mutex_destroy(&buf->mutex);\n"
+ "173 pthread_cond_destroy(&buf->xp);\n"
+ "7.2. PETERSON’S SOLUTION TO CRITICAL REGION PROBLEM 119\n"
+ "174 pthread_cond_destroy(&buf->xc);\n"
+ "175\n"
+ "176 printf(\"program ending...bye..\\n\");\n"
+ "177 exit (0);\n"
+ "178 }";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}
}
}
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Java, please visit: https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html