面试被问到:c/c++语言实现主线程创建10个子线程,每个子线程不断+1,直到1000
#include <pthread.h>
#include <cstdio>
//#include "sem.hpp"
#include <assert.h>
pthread_mutex_t mutex;
int number = 0;
//sem mysem;
//sem_t mysem;
void *worker(void* arg){
while(true){
pthread_mutex_lock(&mutex);
if(number==1000){
// sem_post(&mysem);
pthread_mutex_unlock(&mutex);
return((void*)0);
}else{
number++;
printf("%d:%d\n",pthread_self(),number);
}
pthread_mutex_unlock(&mutex);
}
return ((void*)0);
}
int main(){
pthread_mutex_init(&mutex, NULL);
// assert(sem_init(&mysem, 0, 0)==0);//mac不支持创建无名信号量
// printf("%d",sem_init(&mysem,0,0));
// sem_init(&mysem,0,0);
pthread_t* m_threads = new pthread_t[10];
for(int i = 0; i < 10; ++i){
if(pthread_create(m_threads+i,NULL,worker,NULL)!=0){
delete [] m_threads;
printf("errora\n");
}
if(pthread_detach(m_threads[i])){
delete [] m_threads;
printf("errorb\n");
}
}
while(true){
pthread_mutex_lock(&mutex);
// sem_wait(&mysem);
if(number==1000){
pthread_mutex_unlock(&mutex);
return 0;
}
pthread_mutex_unlock(&mutex);
}
return 0;
}
运行结果:
另外,c++11提供了thread支持,改写代码如下:
#include <iostream>
#include <mutex>
#include <thread>
#include <vector>
using namespace std;
std::mutex myMutex;
int cnt = 0;
class task{
public:
void operator()(){
while(true){
std::lock_guard<std::mutex> lg(myMutex);
if(cnt==1000)break;
else{
cout << pthread_self()<< ": "<<cnt << endl;
cnt++;
}
}
}
};
int main(){
std::thread* v = new std::thread[10];
for(int i = 0; i < 10; ++i){
task mytask;
v[i] = std::thread(mytask);
}
for(int i = 0; i < 10; ++i)v[i].join();
// std::lock_guard<std::mutex> lg(myMutex);
if(cnt==1000)cout << "main thread" << endl;
return 0;
}